2010-06-16 2 views
9

Можно создать дубликат:
Detect if a method was overridden using Reflection (C#)Проверьте, является ли метод переопределением?

Есть ли способ узнать, есть ли метод переопределяет? Напр.

public class Foo 
{ 
    public virtual void DoSomething() {} 
    public virtual int GimmeIntPleez() { return 0; } 
} 

public class BabyFoo: Foo 
{ 
    public override int GimmeIntPleez() { return -1; } 
} 

Можно ли задуматься о BabyFoo и сказать, если GimmeIntPleez переопределяет?

+4

Duplicate? - http://stackoverflow.com/questions/2932421/detect-if-a-method-was-overridden-using-reflection-c –

+0

Во время выполнения или время компиляции? –

+0

Отлично! Большое спасибо, Петар. Как найти такие темы? –

ответ

3

Вы можете использовать MethodInfo.DeclaringType, чтобы определить, является ли метод переопределением (при условии, что это также IsVirtual = true).

Из документации:

... обратите внимание, что, когда B переопределяет виртуальный метод М из А, по существу, переопределяет (или redeclares) этот метод. Поэтому, сообщает MethodInfo BM в объявляющий типа, как B, а не A, даже несмотря на то, где этот метод был первоначально объявлен ...

Вот пример:

var someType = typeof(BabyFoo); 
var mi = someType.GetMethod("GimmeIntPleez"); 
// assuming we know GimmeIntPleez is in a base class, it must be overriden 
if(mi.IsVirtual && mi.DeclaringType == typeof(BabyFoo)) 
    { ... } 
+0

Мой комментарий приходит немного позже, но вот он. Я не думаю, что это решение будет выполнено, потому что тип BabyFoo может объявить свой собственный виртуальный метод с тем же именем, но с разными параметрами. Это решение не обнаружит этого. –

12

Тест против MethodInfo.GetBaseDefinition(). Если функция является переопределением, она возвращает другой метод в базовом классе. Если это не так, тот же объект метода будет возвращен.

При переопределении в производном классе возвращается объект MethodInfo для метода в прямом или косвенном базовом классе, в котором впервые был объявлен метод, представленный этим экземпляром.

+3

+1, потому что вы первый, упоминающий метод GetBaseDefinition, который, я думаю, является правильным способом выяснить, является ли метод переопределением. –

Смежные вопросы