为什么不是';t这个类被类型密封了,我能用它做什么

本文关键字:密封 什么 类型 为什么不 | 更新日期: 2023-09-27 18:25:24

我在查看Type的元数据,注意到一个成员受到了保护,这让我想知道它可能派生出什么,这让我们意识到我可以编写一个派生自它的类,所有这些都让我想我能用它做些什么(如果有的话)。

以下没有编译器错误:

class MyType : Type
{
    // Implemented abstract members here.
}

为什么不是';t这个类被类型密封了,我能用它做什么

好问题。我只有部分答案。目前有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实例。