我想实现一个具有以下签名的方法
dynamic Cast(object obj, Type castTo);
有人知道怎么做吗? obj 确实实现了 castTo,但需要正确转换才能使我的应用程序的一些运行时绑定(bind)内容正常工作。
编辑:如果某些答案没有意义,那是因为我最初不小心输入了 dynamic Cast(dynamic obj, Type castTo);
- 我的意思是输入应该是 object
或其他一些有保证的基类
最佳答案
我认为您在这里混淆了转换和转换的问题。
- 转换:更改指向对象的引用类型的行为。向上或向下移动对象层次结构或实现接口(interface)
- 转换:从不同类型的原始源对象创建新对象,并通过对该类型的引用访问它。
通常很难区分 C# 中的 2 之间的区别,因为它们都使用相同的 C# 运算符:强制转换。
在这种情况下,您几乎可以肯定不是在寻找强制转换操作。将一个 dynamic
转换为另一个 dynamic
本质上是一种身份转换。它没有提供任何值(value),因为您只是将 dynamic
引用返回到相同的底层对象。结果查找不会有什么不同。
在这种情况下,您似乎想要的是转换。那就是将底层对象变形为不同的类型,并以 dynamic
方式访问生成的对象。最好的 API 是 Convert.ChangeType
。
public static dynamic Convert(dynamic source, Type dest) {
return Convert.ChangeType(source, dest);
}
编辑
更新后的问题包含以下行:
obj definitely implements castTo
如果是这种情况,则不需要存在 Cast
方法。源 object
可以简单地分配给 dynamic
引用。
dynamic d = source;
听起来您想要完成的是通过dynamic
引用查看source
层次结构中的特定接口(interface)或类型。那根本不可能。生成的 dynamic
引用将直接看到实现对象。它不会查看源层次结构中的任何特定类型。因此,转换为层次结构中的不同类型然后返回到 dynamic
的想法与首先分配给 dynamic
完全相同。它仍将指向相同的底层对象。
关于C#:动态运行时转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4925718/