Почему класс Type не запечатан, и что я могу с этим сделать? - PullRequest
18 голосов
/ 20 февраля 2012

Я смотрел на метаданные для Type и заметил, что член защищен, что заставило меня задуматься о том, что из этого может получиться, что заставило меня понять, что я могу написать класс, производный от него, и все, что заставляет меня задуматься о том, что Я могу сделать с этим (если что-нибудь).

Нет ошибок компилятора из следующих:

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

Ответы [ 3 ]

11 голосов
/ 20 февраля 2012

Отличный вопрос.У меня есть только частичный ответ.В настоящее время существует 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, на самом деле нет причин, по которым вы хотели бы получить класс из любого из них.Однако вы можете использовать их в своем собственном классе для инкапсуляции своей собственной логики.

7 голосов
/ 20 февраля 2012

Type незапечатан, потому что он фактически предназначен для наследования средой выполнения.Есть много примеров этого в BCL

  • EnumBuilder
  • RuntimeType
  • TypeBuilder

Наиболее интересные из них, ИМХО,is RuntimeType Это то, как реализовано хорошее большинство Type экземпляров в работающей системе.Большинство вызовов o.GetType() фактически возвращают экземпляр RuntimeType.

7 голосов
/ 20 февраля 2012

Да, не наследуйте от этого; p Есть такие вещи, как RuntimeType и т. Д. - Type - это абстракция, которую вы обычно должны использовать. Если вы хотите динамически представлять тип во время выполнения, есть 2 основных варианта:

  • в 4.0, dynamic (через реализацию IDynamicMetaObjectProvider)
  • до этого TypeDescriptor (путем реализации ICustomTypeDescriptor или предоставления TypeDescriptionProvider и, возможно, TypeConverter)

Если вы хотите заняться метапрограммированием (создавая реальные новые типы во время выполнения, а не подделывая его), есть также TypeBuilder

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...