我有一些我无法控制的代码。此代码接受一个对象参数,并尝试将其转换为在编译时已知这样一种类型的:通过投影算子进行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
,而MyClass
是DataRowView
的包装类,它必须从其他类型派生。 MyClass
保留对DataRowView
的引用。我没有将ComboBox.DataSource
绑定到DataView
,而是将它绑定到IList<MyClass>
,但我仍然需要ComboBox
能够访问DataRowView
列值,就好像我绑定的是IList<DataRowView>
。不幸的是,转换操作符以我所害怕的方式工作:它只考虑编译时类型信息来进行转换(但是,它在相同继承树中的类型之间进行转换时使用运行时类型信息)。
为什么不用一个函数创建'MyType',并返回一个基于'MyType'实例属性构建的'KnownType'实例?您可以将'myType.ToKnownType()'传递给期望'KnownType'的函数。 – xxbbcc
@xxbbcc他说他无法控制班级进行转换。 – Servy
它也取决于代码是如何检查传入的对象。它可能会明确检查对象是否是确切类型,甚至不是从它继承的对象。 – DavidG