[英]Why isn't the class Type sealed, and what can I do with that?
我正在查看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类型,并将它们保存到实际程序集中。 那很酷。
再次编辑
有些大狗说我上面列出的有四种以上的类型。 我使用Reflector ReSharper查找派生类型并找到它们(可能仍然缺少类型):
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
是你应该经常使用的抽象。 如果要在运行时动态表示类型,则有两个主要选项;
dynamic
(通过实现IDynamicMetaObjectProvider
) TypeDescriptor
(通过实现ICustomTypeDescriptor
或提供TypeDescriptionProvider
,可能还有TypeConverter
) 如果你想进行元编程(在运行时创建实际的新类型,而不是欺骗它),还有TypeBuilder
Type
是未密封的,因为它实际上被设计为由运行时继承。 在BCL中有很多例子
其中最有趣的是IMHO,它是RuntimeType
这是运行系统中绝大多数Type
实例的实现方式。 大多数对o.GetType()
调用实际上都会返回一个RuntimeType
实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.