【问题标题】:Test if a method is an override? [duplicate]测试一个方法是否是一个覆盖? [复制]
【发布时间】:2010-06-17 02:11:52
【问题描述】:

可能重复:
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 是否是覆盖?

【问题讨论】:

  • 太棒了!非常感谢,佩塔尔。你如何找到这样的线程?
  • @Rowland:在执行(又名运行时)时。在编译时,我可以在源文件上使用正则表达式,如果那是你所暗示的。
  • 使用 StackOverflow 上的搜索功能(右上角) - “C# 方法覆盖”足以找到线程。你也可以使用谷歌:)

标签: c# reflection oop system.reflection


【解决方案1】:

针对MethodInfo.GetBaseDefinition() 进行测试。如果该函数是一个覆盖,它将返回基类中的不同方法。如果不是,则返回相同的方法对象。

当在派生类中被重写时,返回直接或间接基类上的方法的 MethodInfo 对象,在该基类中首先声明了此实例表示的方法。

【讨论】:

  • +1 因为你是第一个提到 GetBaseDefinition 方法的人,我认为这是判断一个方法是否是覆盖的正确方法。
【解决方案2】:

您可以使用MethodInfo.DeclaringType 来确定该方法是否是覆盖(假设它也是IsVirtual = true)。

来自文档:

...请注意,当 B 覆盖 virtual 来自 A 的方法 M,它本质上是 重新定义(或重新声明)此方法。 因此,B.M 的 MethodInfo 报告 声明类型为 B 而不是 A, 即使 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) )
    { ... }

【讨论】:

  • 我的评论来的有点晚,但它是。我不认为这种解决方案会起作用,因为 BabyFoo 类型可能会声明自己的具有相同名称但参数不同的虚拟方法。此解决方案不会检测到这一点。
猜你喜欢
  • 2013-02-22
  • 1970-01-01
  • 2011-06-16
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 2011-07-03
相关资源
最近更新 更多