Tester si une méthode est une substitution? [dupliquer]
-
27-09-2019 - |
Question
Possible en double: détecter si une méthode a été remplacée en utilisant la réflexion (C #)
Yat-il un moyen de savoir si une méthode est une dérogation? Pour 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 un remplacement?
La solution
Vous pouvez utiliser MethodInfo.DeclaringType pour déterminer si le procédé est une valeur de remplacement (en supposant qu'il est également IsVirtual = true
).
De la documentation:
... Notez que lorsque B virtuel overrides Procédé M de A, il essentiellement redéfinit (ou redéclare) cette méthode. Par conséquent, B.M est des rapports MethodInfo le type déclarant que B plutôt que A, même si A est où cette méthode a été initialement déclarée ...
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) )
{ ... }
Autres conseils
Test contre MethodInfo.GetBaseDefinition()
. Si la fonction est une dérogation, il retournera une autre méthode dans une classe de base. Si ce n'est pas, le même objet de la méthode sera retourné.
En cas de substitution dans une classe dérivée, retourne l'objet MethodInfo pour la méthode de la classe de base directe ou indirecte, dans lequel le procédé représenté par cette instance a été déclarée.