如何在.NET中比较类型? CLR如何识别它们是相同还是不同?

时间:2011-06-22 17:49:41

标签: .net types

Type.Equals(Type)如何比较类型以确定它们是否相同?

最初的问题因为我在身体中所拥有的东西而被混淆,因为我认为这会引导问题。忘记那一部分。问题出在标题中。

编辑: Lasse V. Larksen提出了我最好的问题:

  

“构成.NET类型标识的内容”......“如果我在两个不同的项目/程序集中声明完全相同的类型,直到名称空间,.NET认为它们不同,为什么?”

3 个答案:

答案 0 :(得分:4)

它是这样实现的:(来自参考源)

public virtual bool Equals(Type o)
{ 
    if ((object)o == null) 
        return false;

    return (Object.ReferenceEquals(this.UnderlyingSystemType, o.UnderlyingSystemType));
}

答案 1 :(得分:1)

public override bool Equals(object o)
{
    return (((o != null) && (o is Type)) && (this.UnderlyingSystemType == ((Type) o).UnderlyingSystemType));
}

这是来自最新的反映来源。

答案 2 :(得分:1)

ECMA-335公共语言基础设施分区I和II规定每种类型将由给定的类型签名知道。它说明了IL如何表示此签名以及虚拟执行系统应如何解释签名,但它留下了一致的运行时实现必须如何实现类型签名直到实现(据我所知)。

  

新的类型 - 值类型和引用类型 - 通过元数据中表示的类型声明引入到CTS中。此外,元数据是一种结构化方式,用于表示CLI用于定位和加载类,在内存中布置实例,解析方法调用,将CIL转换为本机代码,强制实施安全性以及设置运行时上下文边界的所有信息。

但是,对于您的问题,无论UnderlyingSystemType实际实现的方式如何,它都会使用包含的内容与唯一引用相关联:

  • 装配
  • 模块
  • 命名空间
  • 父类型(如果有)
  • 类型本身

分区II具有TypeDef(第22.37节)的物理元数据,用于对此信息进行编码。

分区III包含IL,表示将元数据令牌(称为RuntimeHandle)加载到堆栈中。类型,方法和字段有不同的句柄,具体取决于IL指令的标记。

相关问题