C#:动态运行时转换

标签 c# c#-4.0 casting

我想实现一个具有以下签名的方法

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/

相关文章:

javascript - 单击后禁用按钮单击并在 10 秒后使用 jquery 或 javascript 在 asp.net web 表单中重新启用

c# - 从_capture.QueryFrame()删除背景

c#-4.0 - 是否有任何 MSBuild 替代方案?

c# - 如何将 `System.Dynamic` 添加到我的项目中?

c#-4.0 - 如何使用NAudio从Wav文件读取文本?

c# - 在 C# 中格式化主图表的轴

c# - 控制台应用程序触发一个进程,然后关闭自身

c++ - 为什么基于范围的 for 循环中二维数组的元素是 T* 而不是 T (*)[n]?

datetime - SAS 将字符串转换为日期时间

c++ - C4267 : 'return' : conversion from 'size_t' to 'const UINT' , 可能丢失数据