2010-06-16 5 views
9

Eventuali duplicati:
Detect if a method was overridden using Reflection (C#)Verificare se un metodo è un override?

Esiste un modo per capire se un metodo è un override? Ad es.

public class Foo 
{ 
    public virtual void DoSomething() {} 
    public virtual int GimmeIntPleez() { return 0; } 
} 

public class BabyFoo: Foo 
{ 
    public override int GimmeIntPleez() { return -1; } 
} 

E 'possibile riflettere su BabyFoo e dire se GimmeIntPleez è un override?

+4

Duplicato? - http://stackoverflow.com/questions/2932421/detect-if-a-method-was-overridden-using-reflection-c –

+0

In fase di runtime o tempo di compilazione? –

+0

Eccellente! Molte grazie, Petar. Come trovi questi fili? –

risposta

3

È possibile utilizzare MethodInfo.DeclaringType per determinare se il metodo è un override (supponendo che sia anche IsVirtual = true).

Dalla documentazione:

... notare che quando B sovrascrive virtuale metodo M da A, essenzialmente ridefinisce (o redeclares) questo metodo. Pertanto, MethodInfo di BM riporta il tipo dichiarando come B piuttosto che A, anche se A è dove questo metodo è stato originariamente dichiarato ...

Ecco un esempio:

var someType = typeof(BabyFoo); 
var mi = someType.GetMethod("GimmeIntPleez"); 
// assuming we know GimmeIntPleez is in a base class, it must be overriden 
if(mi.IsVirtual && mi.DeclaringType == typeof(BabyFoo)) 
    { ... } 
+0

Il mio commento arriva un po 'in ritardo, ma eccolo qui. Non penso che questa soluzione farà perché il tipo BabyFoo può dichiarare il proprio metodo virtuale con lo stesso nome ma diversi parametri. Questa soluzione non lo rileva. –

12

Test contro MethodInfo.GetBaseDefinition(). Se la funzione è di tipo override, restituirà un metodo diverso in una classe base. Se non lo è, verrà restituito lo stesso metodo.

Quando sottoposto a override in una classe derivata, restituisce l'oggetto MethodInfo per il metodo sulla classe di base diretta o indiretta in cui il metodo rappresentato da questa istanza è stato dichiarato per la prima volta.

+3

+1 perché sei il primo a menzionare il metodo GetBaseDefinition, che ritengo sia il modo corretto per capire se un metodo è un override. –