В дополнение к превосходному ответу Гравитона , я рекомендую еще одно практическое правило, чтобы решить, когда создавать новый метод:
Всякий раз, когда вы чувствуете, что хотите написать комментарий к части кода, вместо этого переместите этот код в выделенную функцию. Дайте описательное имя для функции.
Вам нужен 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
Я ожидал, что BindingFlags.DeclaredOnly, используемый с Type.GetMethods (), даст вам желаемый эффект:
http://msdn.microsoft.com/en- us / library / 4d848zkb (loband) .aspx