2016-09-15 61 views
7

我有一些我无法控制的代码。此代码接受一个对象参数,并尝试将其转换为在编译时已知这样一种类型的:通过投影算子进行C#动态转换

KnownType item = (KnownType) parameter; 

是否有可能在C#设计能够作为传递自定义类MyClass(而不是从KnownType衍生)参数到上面的代码,并通过上述代码转换为KnownType,条件是MyClass可以使用其成员方法本身转换成KnownType

protected KnownType ConvertToKnownType() 
{ 
    // conversion code goes here 
} 

我试图实现自定义转换运算符是这样的:

public static implicit operator KnownType(MyClass source) 
{ 
    KnownType result; 
    // conversion goes here 
    return result; 
} 

但它没有工作(它没有使用)。我是否有权假定,只有在编译时已知源类型,目标类型和转换运算符时,该转换运算符才能工作?

编辑: 我最初没有提供关于代码转换的更多细节,因为我认为它是无关紧要的,因为我主要关注转换操作符的实现方式,即它是否需要查看运行时键入以找到合适的转换器或者是在编译时做出的决定?

要清除事情,KnownType实际上是DataRowView,而MyClassDataRowView的包装类,它必须从其他类型派生。 MyClass保留对DataRowView的引用。我没有将ComboBox.DataSource绑定到DataView,而是将它绑定到IList<MyClass>,但我仍然需要ComboBox能够访问DataRowView列值,就好像我绑定的是IList<DataRowView>。不幸的是,转换操作符以我所害怕的方式工作:它只考虑编译时类型信息来进行转换(但是,它在相同继承树中的类型之间进行转换时使用运行时类型信息)。

+1

为什么不用一个函数创建'MyType',并返回一个基于'MyType'实例属性构建的'KnownType'实例?您可以将'myType.ToKnownType()'传递给期望'KnownType'的函数。 – xxbbcc

+0

@xxbbcc他说他无法控制班级进行转换。 – Servy

+0

它也取决于代码是如何检查传入的对象。它可能会明确检查对象是否是确切类型,甚至不是从它继承的对象。 – DavidG

回答

6

不,这是不可能的。如果您能够从该课程中派生您的班级,则提供的演员将只有成功。不基于继承的任何类型的转换都需要执行转换的类执行与其所做的不同的事情。

我是否有权假定,只有在编译时知道源类型,目标类型和转换运算符时,铸型运算符才起作用?

是的。

+0

请注意,如果'KnownType'是*接口*(或从MarshalByRefObject派生的类型),则可以通过提供透明代理作为'parameter'来诱骗运行时调用自定义转换函数(您可以使用'RealProxy'实现)。 –