【问题标题】:Why isn't the class Type sealed, and what can I do with that?为什么类 Type 不是密封的,我该怎么办?
【发布时间】:2012-03-11 03:37:47
【问题描述】:

我正在查看 Type 的元数据,并注意到一个成员受到保护,这让我想知道它会派生什么,这让我意识到我可以编写一个派生自它的类,这让我想知道什么我可以这样做(如果有的话)。

以下没有编译器错误:

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

【问题讨论】:

  • 非常有趣的问题!但是请删除不必要的代码块,它并没有真正为您的问题增加更多价值,而不仅仅是class MyType : Type { ... }
  • 我会让同意你的编辑权限的人去做,我认为看看派生类必须实现什么才能编译......

标签: c# inheritance types


【解决方案1】:

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

看起来这些类型基本上是用来封装一些“实例构建”的逻辑。但我没有探索过代码。

编辑

哦,哇……这很有趣。代码示例似乎不仅创建了类型的 instances,还创建了 本身。因此,其中一些类正在创建 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 所说,你真的没有理由要从这些中派生一个类。但是,您可以在自己的类中使用它们来封装您自己的逻辑。

【讨论】:

  • 只是一个猜测,但也许当你“预编译”一个正则表达式时,这就是幕后发生的事情
  • 是的,.NET 中的元编程非常强大;我有一些代码真的很疯狂
【解决方案2】:

是的,不要继承它;p 有诸如 RuntimeType 之类的东西 - Type 是您通常应该使用的抽象。如果你想在运行时动态表示一个类型,有两个主要选项;

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

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

【讨论】:

  • 有任何理由从 Type 继承吗? MSDN 上的代码示例显示了一些用于封装某些类创建逻辑的派生类型(例如 EnumBuilder)。使用 Type 或 TypeBuilder 作为基类来生成其他类型或程序集是否合乎逻辑?
  • @ChristopherHarris “builder”版本实际上并不可用;它们只是元编程。只有当CreateType() 用于创建实际 类型(仅称为Type)时,它们才可用
  • 对,我现在明白了。创建更多“构建器”版本是否合适(假设),只使用现有的构建器版本?
  • @ChristopherHarris 不,通过子类化它并没有什么用处,除了真正混淆系统。我不推荐它。
【解决方案3】:

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

  • 枚举生成器
  • 运行时类型
  • 类型生成器

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 2014-12-27
    • 2021-04-27
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多