2010-06-16 22 views
9

Duplicar posibles:
Detect if a method was overridden using Reflection (C#)¿Prueba si un método es una anulación?

¿Hay una manera de saber si un método es una anulación? Por ej.

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

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

¿Es posible reflexionar sobre BabyFoo y decir si GimmeIntPleez es una anulación?

+4

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

+0

¿En tiempo de ejecución o tiempo de compilación? –

+0

¡Excelente! Muchas gracias, Petar. ¿Cómo encuentras esos hilos? –

Respuesta

3

Puede usar MethodInfo.DeclaringType para determinar si el método es una anulación (suponiendo que también sea IsVirtual = true).

De la documentación:

... en cuenta que cuando B anula virtuales método M de A, que esencialmente redefine (o) redeclares este método. Por lo tanto, MethodInfo del BM informa el tipo declarar como B en vez de A, a pesar de que A es donde se declaró originalmente este método ...

He aquí un ejemplo:

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

Mi comentario llega un poco tarde, pero aquí está. No creo que esta solución sirva porque el tipo de BabyFoo puede declarar su propio método virtual con el mismo nombre pero diferentes parámetros. Esta solución no detectará eso. –

12

Prueba contra MethodInfo.GetBaseDefinition(). Si la función es una anulación, devolverá un método diferente en una clase base. Si no es así, se devolverá el mismo objeto de método.

Cuando se invalida en una clase derivada, devuelve el objeto MethodInfo para el método en la clase base directa o indirecta en la que se declaró por primera vez el método representado por esta instancia.

+3

+1 porque es el primero en mencionar el método GetBaseDefinition, que creo que es la forma correcta de determinar si un método es una anulación. –

Cuestiones relacionadas