为什么不是';t这个类被类型密封了,我能用它做什么
本文关键字:密封 什么 类型 为什么不 | 更新日期: 2023-09-27 18:25:24
我在查看Type的元数据,注意到一个成员受到了保护,这让我想知道它可能派生出什么,这让我们意识到我可以编写一个派生自它的类,所有这些都让我想我能用它做些什么(如果有的话)。
以下没有编译器错误:
class MyType : Type
{
// Implemented abstract members here.
}
好问题。我只有部分答案。目前有4个类派生自Type。您可以在MSDN上找到类型层次结构。
System.Object
System.Reflection.MemberInfo
System.Type
System.Reflection.Emit.EnumBuilder
System.Reflection.Emit.GenericTypeParameterBuilder
System.Reflection.Emit.TypeBuilder
System.Reflection.TypeDelegator
看起来这些类型基本上是用来封装一些"实例构建"逻辑的。但我还没有探究过代码。
编辑
哦,哇。。。这很有趣。代码示例似乎不仅创建了类型的实例,而且还创建了类本身。因此,其中一些类正在创建CLR类型,并将它们保存到实际的程序集中。太酷了。
再次编辑
一些大狗说,我上面列出的四种类型不止一种。我使用ReflectorReSharper来查找派生类型,并找到了这些类型(可能仍然缺少类型):
System.Type
System.RuntimeType
System.ReflectionOnlyType
System.Reflection.Emit.EnumBuilder
System.Reflection.Emit.GenericTypeParameterBuilder
System.Reflection.Emit.SymbolType
System.Reflection.Emit.TypeBuilder
System.Reflection.Emit.TypeBuilderInstantiation
System.Reflection.TypeDelegator
再次编辑
正如@MarcGravell所说,你真的没有理由想从其中任何一个派生一个类。但是,您可以在自己的类中使用它们来封装自己的逻辑。
是的,不要从中继承;p有一些东西像RuntimeType
等等——Type
是你通常应该使用的抽象。如果您想在运行时动态地表示一个类型,有两个主要选项;
- 在4.0中,
dynamic
(通过实现IDynamicMetaObjectProvider
) - 在此之前,
TypeDescriptor
(通过实现ICustomTypeDescriptor
或提供TypeDescriptionProvider
,可能还有TypeConverter
)
如果你想进行元编程(在运行时创建实际的新类型,而不是欺骗它),还有TypeBuilder
Type
是未密封的,因为它实际上被设计为运行时固有的。BCL 中有很多这样的例子
- EnumBuilder
- 运行时间类型
- TypeBuilder
其中最有趣的IMHO是RuntimeType
。这就是运行系统中绝大多数Type
实例的实现方式。大多数对o.GetType()
的调用实际上都会返回一个RuntimeType
实例。