2009-05-29 8 views
5

Estoy tratando de usar la reflexión para determinar qué métodos reemplaza una clase derivada de una clase base. Es bastante fácil determinar si el método es no reemplazado, pero tratar de determinar si un método se reemplaza en una clase base o simplemente se crea como virtual en la clase derivada es lo que intento lograr.Buscar la implementación original de un método virtual

Por lo tanto, si la Clase A tiene métodos virtuales Proceso y Exportación, y Clase B tiene métodos virtuales Proceso (reemplazado) y Pantalla (nuevo método virtual), me gustaría obtener los siguientes resultados al examinar la Clase B;

  • métodos sobrescritos: Proceso
  • Métodos no las anula: Exportación

Yo sólo quiero tratar con el método de visualización cuando se examina una clase derivada de la clase B.

Respuesta

6

Es lo GetBaseDefinition estás después?

Básicamente

if (method.GetBaseDefinition() == method) 
{ 
    // Method was declared in this class 
} 

He aquí un ejemplo que muestra los casos que le interesan:

using System; 
using System.Reflection; 

class Base 
{ 
    public virtual void Overridden() {} 
    public virtual void NotOverridden() {} 
} 

class Derived : Base 
{ 
    public override void Overridden() {} 
    public virtual void NewlyDeclared() {} 
} 

public class Test 
{ 
    static void Main() 
    { 
     foreach (MethodInfo method in typeof(Derived).GetMethods()) 
     { 
      Console.WriteLine("{0}: {1} {2} {3}", 
           method.Name, 
           method == method.GetBaseDefinition(), 
           method.DeclaringType, 
           method.GetBaseDefinition().DeclaringType); 
     } 
    } 
} 

Salida:

Overridden: False Derived Base 
NewlyDeclared: True Derived Derived 
NotOverridden: False Base Base 
ToString: False System.Object System.Object 
Equals: False System.Object System.Object 
GetHashCode: False System.Object System.Object 
GetType: True System.Object System.Object 
+1

Perfecto, exactamente lo que estaba buscando. No puedo creer que me lo haya perdido;). –

0

yo esperaría que BindingFlags.DeclaredOnly utiliza con el tipo .GetMethods() le dará el efecto que está buscando:

http://msdn.microsoft.com/en-us/library/4d848zkb(loband).aspx

+1

Esto me dará los métodos que se definen en esta clase, pero una vez que tenga un MethodInfo dado, me gustaría ver si su definición base está en mi clase. –

Cuestiones relacionadas