¿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();
}
}
c#
inheritance
polymorphism
Mango luchador
fuente
fuente

Respuestas:
GetType()devolverá el tipo real instanciado. En su caso, si llamaGetType()a una instancia deB, devolverátypeof(B), incluso si la variable en cuestión se declara como una referencia a unA.No hay ninguna razón para su
GetSubType()método.fuente
GetTypesiempre devuelve el tipo del que realmente se creó una instancia. es decir, el tipo más derivado. Esto significa que seGetSubTypecomporta como élGetTypemismo 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[]Typefuente
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.
fuente