获取动态声明的对象的类型

32

我想要获取动态对象的类型,类似于:

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

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


似乎我们需要更多的细节。我没有看到你所写的有任何问题。 - Eric Farr
1
如果我打印未知类型的名称,我会得到:"ObjectHandle"而不是底层动态对象的类型。 - Radu M.
2个回答

35

你需要这样做...

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

顺便提一句,这有点令人困惑,因为如果你在当前程序集中调用Activator.CreateInstance方法...

Activator.CreateInstance(typeof(Foo))

...对象没有被包裹,原始代码可以正常工作。


1
顺便提一下,这样做是为了防止程序集不必要地加载到当前的应用程序域中。当您取消包装时,它将被加载。 - x0n
ObjectHandle?你应该意识到.NET Remoting已经被弃用了...并且在.NET Core中将永远不存在! - Latency
@延迟 这个答案是2011年的,显然他们当时无法预料到几年后会出现一个框架。 - b.pell
哦,是的...你说得对!我忽略了这篇文章的日期,并假设它是今年的。 - Latency
在我的情况下无法工作。无论如何,在框架4.8中,dynamic 无法转换为 ObjectHandle,它会给出以下错误:{"Cannot convert type 'System.__ComObject' to 'System.Runtime.Remoting.ObjectHandle'"} - Franck

2
如果您可以使用Activator.CreateInstance,您可以直接使用:
object tmp = Activator.CreateInstance(assembly, nmspace + "." + typeName);
Type unknown = tmp.GetType();

2
对象不是稍微有点不同于动态吗? - amalgamate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接