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

Aar*_*ide 18 c# inheritance types

我正在查看Type的元数据,并注意到一个成员受到保护,这让我想知道它可能从中得到什么,这让我意识到我可以编写一个源自它的类,这一切让我想知道我能做些什么与此(如果有的话).

以下没有编译器错误:

class MyType : Type
{
    // Implemented abstract members here.
}
Run Code Online (Sandbox Code Playgroud)

cwh*_*ris 11

好问题.我只有部分答案.目前有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
Run Code Online (Sandbox Code Playgroud)

看起来这些类型基本上用于封装一些"实例构建"逻辑.但我没有探索过代码.

编辑

哦,哇......这很有趣.代码示例似乎不仅要创建类型的实例,还要创建本身.因此,其中一些类正在创建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
Run Code Online (Sandbox Code Playgroud)

再次编辑

正如@MarcGravell所说,你真的没有理由想从这些中派生出一个类.但是,您可以在自己的类中使用它们来封装自己的逻辑.


Mar*_*ell 7

是的,不要继承; p有类似的东西RuntimeType- Type是你应该经常使用的抽象.如果要在运行时动态表示类型,则有两个主要选项;

  • 在4.0中,dynamic(通过实施IDynamicMetaObjectProvider)
  • 在那之前,TypeDescriptor(通过实施ICustomTypeDescriptor或提供TypeDescriptionProvider,可能还有TypeConverter)

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


Jar*_*Par 7

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

  • EnumBuilder
  • RuntimeType
  • TypeBuilder

其中最有趣的是恕我直言,RuntimeType 这就是Type运行系统中大多数实例的实现方式.大多数调用o.GetType()实际上都会返回一个RuntimeType实例.