¿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
GetType
siempre devuelve el tipo del que realmente se creó una instancia. es decir, el tipo más derivado. Esto significa que seGetSubType
comporta como élGetType
mismo 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.GetCustomAttributes
devuelve .Attribute[]
Type
fuente
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
.GetType
mé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