我有一些我无法控制的代码.此代码接受一个对象参数,并尝试将其转换为编译时已知的类型,如下所示:
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,而MyClass是DataRowView的包装类,必须从其他类型派生. MyClass保留对DataRowView的引用.我没有将ComboBox.DataSource绑定到DataView,而是将其绑定到IList< MyClass>但我仍然需要ComboBox能够访问DataRowView列值,就好像我绑定了IList< DataRowView>.不幸的是,强制转换操作符的工作方式与我担心的方式相同:它只考虑编译时类型信息来进行转换(但它在同一继承树中的类型之间进行转换时会使用运行时类型信息).
解决方法
不,这是不可能的.如果您能够从该类派生您的类,则提供的强制转换才会成功.任何不基于继承的转换都需要执行转换的类执行与其正在执行的操作不同的操作.
Am I right to assume that the cast operator only works when the source type,target type and conversion operators are known at compile time?
是.