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

118

¿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 debería simplemente 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();
   }
}
Mango luchador
fuente
10
bueno, ¿lo probaste?
BrokenGlass
2
@BrokenGlass normalmente haría eso, pero no estoy en una computadora ... solo usé mi teléfono para hacer la publicación porque se estaba comenzando a formar una solución para un problema y ¡tenía curiosidad por saberlo ahora! = P
Feisty Mango

Respuestas:

133

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

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

Reed Copsey
fuente
¿Aunque lo hace? Estoy pasando una instancia de un objeto de su superclase (abstracta), el receptor solo ve la superclase. ¿No es que siempre devolverá lo que el identificador se definió como no la instancia? - ¿O me estoy perdiendo algo?
Ah, ja ... la diferencia es el uso de TypeOf (X) frente a x.GetType (), creo
22

GetTypesiempre devuelve el tipo del que realmente se creó una instancia. es decir, el tipo más derivado. Esto significa que se GetSubTypecomporta como él GetTypemismo y, por lo tanto, es innecesario.

Para obtener de forma estática el tipo de información de algún tipo que pueda utilizar typeof(MyClass).

Sin embargo, su código tiene un error: no System.Attribute.GetCustomAttributesdevuelve .Attribute[]Type

CódigosInChaos
fuente
7

GetType siempre devuelve el tipo real.

La razón de esto está profundamente en el marco .NET y CLR , ya que JIT y CLR usan el .GetTypemétodo para crear un objeto Type en la memoria que contiene la información sobre el objeto, y todo el acceso al objeto y la compilación se realiza a través de esta instancia de Type .

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

yoel halb
fuente