C# 通过强制转换运算符进行动态转换

标签 c# casting

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

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 , 而 MyClassDataRowView 的包装类必须从其他类型派生。 MyClass保留对 DataRowView 的引用.而不是绑定(bind) ComboBox.DataSourceDataView ,我将它绑定(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/

相关文章:

java - 包装奇怪的行为

java - 当仅给定类名作为该类型的字符串时转换为未知类型

c++ - 类型转换和检查是 vector 中存在的实例

c# - 有没有办法从 C# 中的引用类初始化对象?

Java hibernate : What would be the better design to get rid of casting

c# - 如何将命令行参数传递给 docker run 并打印它?

c# - 使用 ADO.Net 多线程访问 MySQL

php自动对象到数组的转换

c# - 生产服务器上的 SQL Server 2000 间歇性连接异常 - 特定环境问题?

c# - MS Access 互操作性 - 数据导入