【问题标题】:Can Object.GetType also be used for late binding?Object.GetType 也可以用于后期绑定吗?
【发布时间】:2010-03-09 20:40:50
【问题描述】:

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

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

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

b) 如果是 --> o.GetType 如何提取有关 o 的元数据,因为程序的程序集不包含类型 T 的任何元数据(这里我假设 Object.GetType 咨询尝试获取有关特定类型的 gt 信息时的程序集元数据)?

感谢

【问题讨论】:

    标签: c# .net reflection


    【解决方案1】:

    a) 是的,您可以使用 Type.Invoke 和 Type.GetMember 等方法执行 late binding。但是这样代码会变得有点复杂。 C# 4.0 添加了dynamic keyword 以简化操作。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • "...您已经加载了动态程序集,现在您可以查询新程序集的类型。"但是运行时如何知道它应该查看动态加载的程序集以获取类型 T 的信息?
      • 因为 .Net 会跟踪应用程序中所有加载类型的元数据的位置。例如,Type.Assembly 给出了类型所在的程序集。
      【解决方案3】:

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

      “后期绑定”到底是什么意思?

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

      【讨论】:

      • A) “每个实例化的对象都有一个指向其类型信息的指针” 你的意思是实例 o 以某种方式指向动态加载的程序集 A? B)“你所说的“后期绑定”到底是什么意思?”我认为当我们动态加载程序集 A,然后调用 Type t=A.GetType(“T”) 然后调用 Activator.CreateInstance(t)) 时也使用该术语?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-01
      • 2015-12-25
      • 2012-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多