2011-04-25 17 views
88

¿GetType() devolverá el tipo más derivado cuando se llame desde la clase base?¿GetType() devolverá el tipo más derivado cuando se llame desde la clase base?

Ejemplo:

public abstract class A 
{ 
    private Type GetInfo() 
    { 
     return System.Attribute.GetCustomAttributes(this.GetType()); 
    } 
} 

public class B : A 
{ 
    //Fields here have some custom attributes added to them 
} 

O debo hacer un método abstracto que las clases derivadas tendrán que implementar como el siguiente?

public abstract class A 
{ 
    protected abstract Type GetSubType(); 

    private Type GetInfo() 
    { 
     return System.Attribute.GetCustomAttributes(GetSubType()); 
    } 
} 

public class B : A 
{ 
    //Fields here have some custom attributes added to them 

    protected Type GetSubType() 
    { 
     return GetType(); 
    } 
} 
+8

bien - ¿lo probó? – BrokenGlass

+1

@BrokenGlass normalmente solo haría eso pero no estoy en una computadora ... solo usé mi teléfono para hacer la publicación porque una solución para un problema comenzaba a formarse y ¡tenía curiosidad por saberlo ahora! = P –

Respuesta

98

GetType() devolverá el tipo real instanciado. En su caso, si llama al GetType() en una instancia de B, devolverá typeof(B), incluso si la variable en cuestión se declara como una referencia a A.

No hay ninguna razón para su método GetSubType().

16

GetType siempre devuelve el tipo que realmente se creó una instancia. es decir, el tipo más derivado. Esto significa que su GetSubType se comporta como GetType y por lo tanto no es necesario.

Para obtener estáticamente la información de tipo de algún tipo, puede usar typeof(MyClass).

Tu código tiene un error: System.Attribute.GetCustomAttributes devuelve Attribute[] no Type.

7

GetType siempre devuelve el tipo real.

La razón para ello es profunda en el marco .NET y CLR, como el JIT y CLR utilice el método .GetType para crear un objeto de tipo de memoria que contiene la información sobre el objeto, y todo el acceso al objeto y la compilación son a través de esta instancia de Tipo.

Para obtener más información, consulte el libro "CLR a través de C#" de Microsoft Press.

Cuestiones relacionadas