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特定类型的信息)?
感谢名单
答案 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在没有声明变量类型时所做的那样)。