Object.GetType也可以用于后期绑定吗?

时间:2010-03-09 20:40:50

标签: c# .net reflection

a)Object.GetType也可以用于后期绑定(我正在阅读的书中说它不能用于后期绑定)?

例如,假设我们使用后期绑定(通过动态加载程序集A,调用A.GetType(“T”)然后调用Activator.CreateInstance)来创建实例(I)类型(T)在编译时未知,如果我们将I作为参数传递给方法 M ,o .GetType是否能够从中提取元数据T使用此提取的元数据创建Type对象?

void M ( object o )
{
  Type someType = o.GetType() ;
}

b)如果是 - > o.GetType如何能够提取关于o的元数据,因为程序的程序集不包含T类型的任何元数据(这里我假设Object.GetType参考程序集的元数据当试图gt特定类型的信息)?

感谢名单

3 个答案:

答案 0 :(得分:2)

a)是的,您可以使用Type.Invoke和Type.GetMember等方法执行late binding。但代码有点精心设计。 C#4.0添加dynamic keyword以简化操作。

b)是的,它可以。它从动态加载的程序集中获取其信息,该程序集首先包含该类型。加载后,它是(运行时)应用程序(AppDomain)的一部分,可以访问它的元数据。

答案 1 :(得分:1)

是。 由于GetType()在运行时获取类型信息而不是编译时间,因此在调用时所有元数据都已存在,因为当加载类型时,它的程序集也已加载,所以当你假设程序没有包含有关类型的信息,记住您已加载动态程序集,现在可以查询新程序集的类型。 希望它有所帮助。

答案 2 :(得分:0)

每个实例化对象都有一个指向其Type信息的指针。 如果您知道类型名称及其来自的程序集,您可以像创建的那样创建它。 .NET将搜索程序集的元数据以查找类型及其所需的所有内容。

你对“后期装订”的意思是什么?

回答评论: 答:是的,每个对象的引用都有8个字节(在x86上)的开销:指向同步锁的指针和指向类型信息的指针。每个程序集都具有描述其中所有类型所需的所有元数据。因此,实例o知道自己及其原始程序集(Type类具有Assembly属性)。 B.'后期约束'有很多定义。我已经看到它经常使用Type.InvokeMember在方法名称仅在运行时知道时调用方法;或者在COM的上下文中,当使用IDispatch时(就像旧的VB在没有声明变量类型时所做的那样)。