2009-05-29 6 views
5

J'essaie d'utiliser la réflexion pour déterminer les méthodes qu'une classe dérivée remplace à partir d'une classe de base. Il est assez facile de déterminer si la méthode est et non, mais essayer de déterminer si une méthode est surchargée dans une classe de base ou simplement créée comme virtuelle dans la classe dérivée est ce que j'essaie d'accomplir. Donc, si la classe A a des méthodes virtuelles Process and Export, et la classe B a des méthodes virtuelles Process (overridden), et Display (nouvelle méthode virtuelle), je voudrais les résultats suivants lors de l'examen de classe B;Rechercher l'implémentation d'origine d'une méthode virtuelle

  • méthodes redéfinies: Processus
  • Méthodes Non OPPOSER Export

Je veux seulement faire face à la méthode d'affichage lors de l'examen d'une classe qui dérive de la classe B.

Répondre

6

Est-GetBaseDefinition ce vous êtes après?

Fondamentalement

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

Voici un exemple montrant les cas qui vous intéressent:

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); 
     } 
    } 
} 

Sortie:

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

Parfait, exactement ce que je cherchais. Je ne peux pas croire que je l'ai manqué;). –

0

j'attendre à ce que BindingFlags.DeclaredOnly utilisé avec le type .GetMethods() va vous donner l'effet que vous recherchez:

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

+1

Cela m'obtient des méthodes qui sont définies dans cette classe, mais une fois que j'ai un MethodInfo donné, je voudrais voir si sa définition de base est dans ma classe. –

Questions connexes