Найдите исходную реализацию виртуального метода

В дополнение к превосходному ответу Гравитона , я рекомендую еще одно практическое правило, чтобы решить, когда создавать новый метод:

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

5
задан Rick Mogstad 29 May 2009 в 17:21
поделиться

2 ответа

Вам нужен 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
6
ответ дан 14 December 2019 в 13:45
поделиться

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

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

0
ответ дан 14 December 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: