繁体   English   中英

为什么班级类型没有密封,我该怎么办呢?

[英]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是你应该经常使用的抽象。 如果要在运行时动态表示类型,则有两个主要选项;

  • 4.0, dynamic (通过实现IDynamicMetaObjectProvider
  • 在此之前, TypeDescriptor (通过实现ICustomTypeDescriptor或提供TypeDescriptionProvider ,可能还有TypeConverter

如果你想进行元编程(在运行时创建实际的新类型,而不是欺骗它),还有TypeBuilder

Type是未密封的,因为它实际上被设计为由运行时继承。 在BCL中有很多例子

  • EnumBuilder
  • RuntimeType
  • TypeBuilder

其中最有趣的是IMHO,它是RuntimeType这是运行系统中绝大多数Type实例的实现方式。 大多数对o.GetType()调用实际上都会返回一个RuntimeType实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM