Подтвердить что ты не робот

Почему класс Type не запечатан, и что я могу сделать с этим?

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

Отсутствует ошибка компилятора:

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

Ответ 1

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

Ответ 2

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

  • в 4.0, dynamic (через реализацию IDynamicMetaObjectProvider)
  • TypeDescriptor (через реализацию ICustomTypeDescriptor или предоставление TypeDescriptionProvider и, возможно, <<27 > )

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

Ответ 3

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

  • EnumBuilder
  • RuntimeType
  • TypeBuilder

Самое интересное из них, IMHO, - это RuntimeType Таким образом, выполняется значительное большинство экземпляров Type в запущенной системе. Большинство вызовов o.GetType() будут фактически возвращать экземпляр RuntimeType.