我有一些我无法控制的代码。此代码接受对象参数并尝试将其转换为编译时已知的类型,如下所示:
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;
}
但是没用(没用过)。我是否可以正确假设强制转换运算符仅在源类型、目标类型和转换运算符在编译时已知时起作用?
编辑: 我最初没有提供有关执行转换的代码的更多详细信息,因为我认为它无关紧要,因为我主要对 cast 运算符的实现方式感兴趣,即它是否查看运行时类型以找到合适的转换器或是在编译时做出决定吗?
为了解决问题,KnownType
实际上是DataRowView
, 而 MyClass
是 DataRowView
的包装类必须从其他类型派生。 MyClass
保留对 DataRowView
的引用.而不是绑定(bind) ComboBox.DataSource
到 DataView
,我将它绑定(bind)到 IList<MyClass>
但我仍然需要 ComboBox
能够访问 DataRowView
列值就好像我绑定(bind)了一个 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?
是的。
关于C# 通过强制转换运算符进行动态转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39513009/