c# - 通过继承判断两个 MethodInfo 实例是否代表同一个(非虚)方法

标签 c# .net inheritance reflection methodinfo

首先我举一个我知道答案的简单例子。考虑:

class Animal
{
  public virtual void M() { Console.WriteLine("a"); }
}
class Giraffe : Animal
{
  public override void M() { Console.WriteLine("g"); }
}

然后在某处代码:

  var am = typeof(Animal).GetMethod("M");
  var gm = typeof(Giraffe).GetMethod("M");
  Console.WriteLine(am == gm);  // False
  Console.WriteLine(am == gm.GetBaseDefinition());  // True

我们看到 amgm 不被认为是相等的,这是完全公平的(后者是对前者的覆盖)。但是,通过最后一行我们可以确定这两个方法是相关的;一个是另一个的“基本方法”。

(您甚至可以检查引用是否相等,(object)am == (object)gm.GetBaseDefinition(),您仍然得到 True。)

现在对于这种情况我有一个问题。考虑一下:

class Plant
{
  public void N() /* non-virtual */ { }
}
class Tree : Plant
{
}

与:

  var pn = typeof(Plant).GetMethod("N");
  var tn = typeof(Tree).GetMethod("N");
  Console.WriteLine(pn == tn);  // False
  // How can I determine that 'pn' and 'tn' are in a sense the same method?

在这种情况下,pntn 仍然被认为是不同的(并且它们的 ReflectedType 不同)。

我如何测试它们实际上(通过继承)是否是相同的方法?

框架有内置方法吗?如果我必须手动解决这个问题,策略是什么?我是否必须检查两者是否具有相同的 DeclaringType、相同的参数(类型)列表以及相同数量的类型参数?

最佳答案

您可以使用 DeclaringType 属性:

am.DeclaringType.Dump(); // Animal
gm.DeclaringType.Dump(); // Giraffe

pn.DeclaringType.Dump(); // Plant
tn.DeclaringType.Dump(); // Plant

或者你可以使用MethodHandle:

(am.MethodHandle == gm.MethodHandle).Dump(); // False

(pn.MethodHandle == tn.MethodHandle).Dump(); // True

虽然我不确定这是否完全可靠。

如果您只关心该方法是否在给定类型中实际被重写,您还可以使用 BindingFlags:

var flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly;

typeof(Plant).GetMethod("N", flags).Dump(); // N
typeof(Tree).GetMethod("N", flags).Dump(); // null

关于c# - 通过继承判断两个 MethodInfo 实例是否代表同一个(非虚)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32377595/

相关文章:

c# - 统一正则表达式

c# - 从 int[] 转换为 int*

c# - 不仅更新 global.asax.cs 还更新 global.asax

ios - 在 Swift(iOS)和 setValue forKey 中子类化 NSObject 的子类

c# - 虚拟基础成员看不到覆盖?

c# - 如何从 ref 经纬度获取 “x” 米的经纬度?

c# - sql查询中的多个SELECT命令

c# - 使用 NLog 通过 WebService 记录自定义类

c# - 如何制作我的应用程序单例应用程序?

javascript - JavaScript 原型(prototype)继承的缺点是什么?