Найти оригинальную реализацию виртуального метода - PullRequest
5 голосов
/ 29 мая 2009

Я пытаюсь использовать рефлексию, чтобы определить, какие методы производный класс переопределяет из базового класса. Довольно легко определить, является ли метод не переопределенным, но я пытаюсь определить, переопределен ли метод в базовом классе или просто создан как виртуальный в производном классе.

Итак, если в классе A есть виртуальные методы Process и Export, а в классе B есть виртуальные методы Process (переопределены) и Display (новый виртуальный метод), я хотел бы получить следующие результаты при рассмотрении класса B;

  • Методы переопределены: процесс
  • Методы не переопределены: экспорт

Я хочу иметь дело только с методом Display при рассмотрении класса, производного от класса B.

Ответы [ 2 ]

6 голосов
/ 29 мая 2009

Является ли GetBaseDefinition тем, что вы ищете?

В основном

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

Вот пример, показывающий интересующие вас случаи:

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

Выход:

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
0 голосов
/ 29 мая 2009

Я ожидаю, что BindingFlags.DeclaredOnly, используемый с Type.GetMethods (), даст вам эффект, который вы ищете:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...