【发布时间】:2021-04-23 12:58:49
【问题描述】:
我正在读一本书,上面写着:
获取 TypeInfo 对象会强制 CLR 通过确保程序集 定义类型被加载。这可能是一项昂贵的操作,如果您需要,可以避免 是类型引用(类型对象)。但是,有了 TypeInfo 对象后,您可以查询许多 类型的属性以了解更多信息。大多数属性,例如 IsPublic、IsSealed、 IsAbstract、IsClass、IsValueType 等表示与类型关联的标志。
以下是部分源代码:
public abstract class Type : ... {
public bool IsPublic { get; }
public bool IsSealed { get; }
public bool IsAbstract { get; }
...
}
public static class IntrospectionExtensions {
public static TypeInfo GetTypeInfo(this Type type);
}
public abstract class TypeInfo : Type {
...
}
我的问题是:
作者的意思好像是你需要在一个Type对象中调用GetTypeInfo方法导致CLR先加载程序集,然后你可以查询IsPublic、IsSealed、IsAbstract、IsClass、IsValueType。所以看来你不能在调用GetTypeInfo 方法之前查询这些属性。但是我对程序集元表的理解是,一个被引用类型的基本信息,例如类型是否是一个类,抽象等都存储在引用程序集的元表中,所以当引用程序集中的代码想要查询一个基本信息时在外部程序集中的类型,CLR 只需要读取引用程序集中的元表,即当前正在执行的程序集,CLR 不需要加载/读取外部(引用)程序集,我的理解是否正确?
【问题讨论】:
-
我认为你误解了作者,他们只是说你可以使用
TypeInfo一旦你有一个,你显然可以使用Type对象(它是抽象的)这是也不是TypeInfo -
@Charlieface 所以当代码(引用程序集)获取在外部程序集中定义的类的类型,并且代码在类型对象上调用 IsPublic 时,是否会加载外部程序集?