【问题标题】:get the Type for a object declared dynamic获取声明为动态的对象的类型
【发布时间】:2011-11-13 19:42:01
【问题描述】:

我想获取动态对象的类型,例如:

dynamic tmp = Activator.CreateInstance(assembly, nmspace + "." + typeName);
Type unknown = tmp.GetType();

除了上述之外,GetType() 返回动态对象的包装器类型,而不是被包装对象的类型。谢谢!

【问题讨论】:

  • 看来我们需要更多细节。我看不出你所拥有的有什么问题。
  • 如果我打印未知类型的名称,我会得到:“ObjectHandle”而不是底层动态对象的类型。

标签: c# dynamic types


【解决方案1】:

你需要这样做......

Type unknown = ((ObjectHandle)tmp).Unwrap().GetType();

顺便说一句,这有点令人困惑,因为如果您在当前程序集中的一个类型上调用 Activator.CreateInstance...

Activator.CreateInstance(typeof(Foo))

...对象未包装,原始代码工作正常。

【讨论】:

  • 顺便说一句,它这样做是为了防止程序集被不必要地加载到当前的应用程序域中。当您打开包装时,它将被加载。
  • 对象句柄?您确实意识到 .NET Remoting 已被弃用......并且永远不会存在于 .NET Core 中!
  • @Latency 答案是从 2011 年开始的,他们显然没有也无法预料到几年后会出现的框架。
  • 哦,是的..你是对的!我忽略了这篇文章的日期,并认为它是从今年开始的。
  • 在我的情况下不起作用。在框架 4.8 中,无论如何dynamic 不能转换为ObjectHandle 它给出以下错误:{"Cannot convert type 'System.__ComObject' to 'System.Runtime.Remoting.ObjectHandle'"}
【解决方案2】:

如果可以使用Activator.CreateInstance,可以直接使用:

object tmp = Activator.CreateInstance(assembly, nmspace + "." + typeName);
Type unknown = tmp.GetType();

【讨论】:

  • 物体和动力学不是略有不同吗?
猜你喜欢
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-09
  • 1970-01-01
相关资源
最近更新 更多