Type.Equals(Type)
如何比较类型以确定它们是否相同?
最初的问题因为我在身体中所拥有的东西而被混淆,因为我认为这会引导问题。忘记那一部分。问题出在标题中。
编辑: Lasse V. Larksen提出了我最好的问题:
“构成.NET类型标识的内容”......“如果我在两个不同的项目/程序集中声明完全相同的类型,直到名称空间,.NET认为它们不同,为什么?”
答案 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指令的标记。