我有一些我无法控制的代码。此代码接受一个object参数,并尝试将其转换为编译时已知的类型,如下所示:
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>
。不幸的是,转换操作符的工作方式与我担心的方式相同:它只考虑编译时类型信息来进行转换(但是在同一继承树中的类型之间进行转换时使用运行时类型信息)。
答案 0 :(得分:6)
不,这是不可能的。如果您能够从该类派生您的类,则提供的强制转换仅成功。任何不基于继承的转换都需要执行转换的类执行与其正在执行的操作不同的操作。
我是否正确地假设转换运算符仅在编译时知道源类型,目标类型和转换运算符时才有效?
是