2010-06-16 4 views
9

Possible en double:
Detect if a method was overridden using Reflection (C#)Test si une méthode est un remplacement?

Y at-il un moyen de savoir si une méthode est une dérogation? Par exemple

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

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

Est-il possible de réfléchir sur BabyFoo et dire si GimmeIntPleez est une dérogation?

+4

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

+0

Lors de l'exécution, ou de la compilation? –

+0

Excellent! Merci beaucoup, Petar. Comment trouvez-vous ces fils? –

Répondre

3

Vous pouvez utiliser MethodInfo.DeclaringType pour déterminer si la méthode est un remplacement (en supposant qu'il soit également IsVirtual = true).

De la documentation:

... Notez que lorsque B remplace la méthode virtuelle M de A, il essentiellement (ou redéfinit redéclare) cette méthode. Par conséquent, rapports MethodInfo de BM le type déclarant que B plutôt que A, même si A est où cette méthode a été initialement déclaré ...

Voici un exemple:

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

Mon commentaire arrive un peu tard, mais le voici. Je ne pense pas que cette solution va faire car le type BabyFoo peut déclarer sa propre méthode virtuelle avec le même nom mais des paramètres différents. Cette solution ne détectera pas cela. –

12

Test contre MethodInfo.GetBaseDefinition(). Si la fonction est une substitution, elle retournera une méthode différente dans une classe de base. Si ce n'est pas le cas, le même objet méthode sera retourné.

En cas de substitution dans une classe dérivée, renvoie l'objet MethodInfo de la méthode sur la classe de base directe ou indirecte dans laquelle la méthode représentée par cette instance a été déclarée en premier.

+3

+1 parce que vous êtes le premier à mentionner la méthode GetBaseDefinition, qui est la bonne façon de déterminer si une méthode est un override. –

Questions connexes