我有一些我无法控制的代码。此代码接受一个对象参数,并尝试将其强制转换为在编译时已知的类型,如下所示:

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绑定(bind)到DataView,而是将其绑定(bind)到IList<MyClass>,但是我仍然需要ComboBox才能访问DataRowView列值,就好像我绑定(bind)了IList<DataRowView>一样。不幸的是,强制转换运算符以我担心的方式工作:它仅考虑编译时类型信息进行转换(但是,在同一继承树中的类型之间进行转换时,它确实使用运行时类型信息)。

最佳答案

不,这是不可能的。仅当您能够从该类派生您的类时,所提供的强制转换才会成功。任何不基于继承的转换类型都将要求执行转换的类执行与正在执行的操作不同的操作。



是的。

关于c# - 通过强制转换运算符进行C#动态转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39513009/

10-11 02:06
查看更多