一尘不染

C#:动态运行时强制转换

c#

我想用以下签名实现一个方法

dynamic Cast(object obj, Type castTo);

有人知道该怎么做吗?obj肯定实现了castTo,但是需要正确地进行强制转换才能使我的应用程序的某些运行时绑定工作解决。

编辑:如果某些答案没有意义,那是因为我最初不小心键入了dynamic Cast(dynamic obj, Type castTo);-我的意思是输入应该是object或其他保证的基类


阅读 705

收藏
2020-05-19

共1个答案

一尘不染

我认为您在此混淆了转换和转换的问题。

  • 投射:更改指向对象的引用类型的动作。向上或向下移动对象层次结构或移至已实现的界面
  • 转换:从其他类型的原始源对象创建一个新对象,并通过对该类型的引用对其进行访问。

通常很难知道C#中2之间的区别,因为它们都使用相同的C#运算符:强制转换。

在这种情况下,您几乎肯定不会在寻找强制转换操作。将a
强制转换dynamic为另一个dynamic实质上是身份转换。它没有任何价值,因为您只是获得dynamic对相同基础对象的引用。所得的查询将没有不同。

相反,在这种情况下,您似乎想要的是一次转换。那就是将基础对象变形为其他类型,并以某种dynamic方式访问结果对象。最好的API是Convert.ChangeType

public static dynamic Convert(dynamic source, Type dest) {
  return Convert.ChangeType(source, dest);
}

编辑

更新后的问题如下行:

obj绝对实现castTo

如果是这种情况,则Cast不需要使用该方法。object可以简单地将源分配给dynamic参考。

dynamic d = source;

听起来您要完成的工作是source通过dynamic引用查看层次结构中的特定接口或类型。那根本不可能。生成的dynamic参考将直接看到实现对象。它不会查看源层次结构中的任何特定类型。因此,在层次结构中强制转换为其他类型,然后再返回的想法与首先dynamic分配给完全相同dynamic。它仍将指向相同的基础对象。

2020-05-19