GetType () restituirà il tipo più derivato quando viene chiamato dalla classe base?


118

GetType () restituirà il tipo più derivato quando viene chiamato dalla classe base?

Esempio:

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 dovrei semplicemente creare un metodo astratto che le classi derivate dovranno implementare come il seguente?

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();
   }
}

10
beh, l'hai provato?
BrokenGlass

2
@BrokenGlass normalmente lo farei ma non sono al computer ... ho solo usato il mio telefono per fare il post perché una soluzione per un problema stava iniziando a formarsi ed ero curioso di sapere ora! = P
Feisty Mango

Risposte:


133

GetType()restituirà il tipo effettivo istanziato. Nel tuo caso, se chiami GetType()su un'istanza di B, restituirà typeof(B), anche se la variabile in questione viene dichiarata come riferimento a un file A.

Non c'è motivo per il tuo GetSubType()metodo.


Comunque? Sto passando un'istanza di un oggetto dalla sua super classe (astratta), il destinatario vede solo la super classe. Non è che restituirà sempre ciò che l'handle è stato definito come non l'istanza? - Oppure mi sfugge qualcosa?

Ah ah .. la differenza sta usando TypeOf (X) rispetto a x.GetType () penso

22

GetTyperestituisce sempre il tipo che è stato effettivamente istanziato. cioè il tipo più derivato. Ciò significa che il tuo GetSubTypesi comporta proprio come GetTypese stesso e quindi non è necessario.

Per ottenere staticamente le informazioni sul tipo di un tipo che puoi utilizzare typeof(MyClass).

Il tuo codice ha un errore però: non System.Attribute.GetCustomAttributesrestituisce .Attribute[]Type


7

GetType restituisce sempre il tipo effettivo.

Il motivo risiede nel framework .NET e in CLR , poiché JIT e CLR utilizzano l'estensione.GetType metodo per creare un oggetto Type in memoria che contiene le informazioni sull'oggetto e tutti gli accessi all'oggetto e alla compilazione avvengono tramite questa istanza Type .

Per ulteriori informazioni, dai un'occhiata al libro "CLR tramite C #" di Microsoft Press.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.