2012-02-20 25 views
18

Estaba mirando los metadatos de Tipo, y noté que un miembro estaba protegido, lo que me hizo preguntarme qué podría derivarse de él, lo que me hizo darme cuenta de que podía escribir una clase que derivara de él, y todo eso me hace preguntarme qué puede hacer con eso (en todo caso).¿Por qué no está sellado el tipo de clase y qué puedo hacer con eso?

Sin error del compilador del siguiente:

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

¡Pregunta muy interesante! Pero elimine ese bloque de código innecesario, realmente no agrega más valor a su pregunta que solo 'clase MyType: tipo {...}'. – stakx

+0

voy a dejar que alguien con privilegios de edición que esté de acuerdo contigo lo haga, creo que es inútil ver lo que debe implementar una clase derivada para compilar ... –

Respuesta

11

Muy buena pregunta. Solo tengo una respuesta parcial. Actualmente hay 4 clases que se derivan de Tipo. Puede encontrar la jerarquía de tipos en MSDN.

System.Object 
    System.Reflection.MemberInfo 
    System.Type 
     System.Reflection.Emit.EnumBuilder 
     System.Reflection.Emit.GenericTypeParameterBuilder 
     System.Reflection.Emit.TypeBuilder 
     System.Reflection.TypeDelegator 

Parece que esos tipos se utilizan básicamente para encapsular una lógica de "creación de instancia". Pero no he explorado el código.

Edición

Oh, vaya ... eso es interesante. Los ejemplos de código parecen no solo crear instancias de tipos, sino también clases sí mismos. Por lo tanto, algunas de estas clases crean tipos CLR y los guardan en ensamblajes reales. Eso es muy bonito.

Editar Una vez más

Algunos de los perros grandes han dicho que hay más de los cuatro tipos que se enumeran más arriba. Solía ​​ Reflector ReSharper para encontrar los tipos derivados y encontrado los (tipos todavía podría faltar):

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 

Editar Una vez más

como se indica @MarcGravell, no hay realmente ninguna razón por qué querría derivar una clase de cualquiera de estos. Sin embargo, podría usarlos dentro de una clase propia para encapsular su propia lógica.

+1

solo una conjetura, pero tal vez cuando "pre compilas" un expresión, eso es lo que sucede detrás de las escenas –

+1

sí, la meta-programación es muy fuerte en .NET; Tengo un código que hace cosas realmente locas con ese –

7

Sí, no heredó de eso; p Hay cosas como RuntimeType etc. - Type es la abstracción que normalmente debería usar. Si desea representar un tipo dinámicamente en tiempo de ejecución, existen 2 opciones principales;

  • en 4.0, dynamic (a través de la implementación de IDynamicMetaObjectProvider)
  • antes de eso, TypeDescriptor (a través de la implementación de ICustomTypeDescriptor o proporcionar un TypeDescriptionProvider, y posiblemente un TypeConverter)

Si usted quiere hacer meta-programación (crear nuevos tipos reales en tiempo de ejecución, en lugar de suplantarlo), también existe TypeBuilder

+0

¿Habría alguna razón para heredar de Type? Los ejemplos de código en MSDN muestran algunos de los tipos derivados que se utilizan para encapsular alguna lógica de creación de clase (como EnumBuilder). ¿Sería lógico usar Type o TypeBuilder como clase base para generar otros tipos o ensamblajes? –

+0

@ChristopherHarris las versiones de "generador" no son en realidad * utilizables *; son metaprogramación solamente. Solo cuando 'CreateType()' se usa para crear un tipo * actual * (conocido solo como 'Type') que son utilizables –

+0

Bien, ahora lo veo. ¿Sería apropiado (hipotéticamente) crear más versiones de "generador", solo use las versiones de compilador existentes? –

7

Type es uns emitido porque está diseñado para ser heredado por el tiempo de ejecución.Hay muchos ejemplos de esto en el BCL

  • EnumBuilder
  • RuntimeType
  • TypeBuilder

Lo más interesante de estos, en mi humilde opinión, es RuntimeType Así es como una buena mayoría de los Type casos en un sistema en ejecución están implmentadas. La mayoría de las llamadas al o.GetType() realmente devolverán una instancia de RuntimeType.

Cuestiones relacionadas