MethodInfo声明类型的等式

我需要检查两个MethodInfos之间的相等性。 它们实际上是完全相同的MethodInfo,但ReflectedType除外(也就是说,DeclaringType是相同的,并且方法实际上应该具有相同的主体)。 有很多方法可以做到这一点,但我正在寻找最有效的方法。

现在我有:

public static bool AreMethodsEqualForDeclaringType(this MethodInfo first, MethodInfo second) { first = first.ReflectedType == first.DeclaringType ? first : first.DeclaringType.GetMethod(first.Name, first.GetParameters().Select(p => p.ParameterType).ToArray()); second = second.ReflectedType == second.DeclaringType ? second : second.DeclaringType.GetMethod(second.Name, second.GetParameters().Select(p => p.ParameterType).ToArray()); return first == second; } 

这有点贵,所以我想知道是否有更好的方法……

我应该比较两个方法体吗? 例如。

 first.GetMethodBody() == second.GetMethodBody() 

谢谢。

我想我会留下我的答案作为问题的答案……

有一点需要注意:

 first.GetMethodBody() == second.GetMethodBody() 

不起作用…所以我发现的唯一答案是:

 public static bool AreMethodsEqualForDeclaringType(this MethodInfo first, MethodInfo second) { first = first.ReflectedType == first.DeclaringType ? first : first.DeclaringType.GetMethod(first.Name, first.GetParameters().Select(p => p.ParameterType).ToArray()); second = second.ReflectedType == second.DeclaringType ? second : second.DeclaringType.GetMethod(second.Name, second.GetParameters().Select(p => p.ParameterType).ToArray()); return first == second; } 

会比较MetadataToken和Module帮助吗?

MetadataToken的文档将其描述为:“与Module一起唯一标识元数据元素的值。”

到目前为止,我发现它正在用于比较equal-except-for-ReflectedType MemberInfo实例。 但是我没有对通用方法定义这样的情况进行测试。

当您尝试使用类和接口方法时,此代码有效:

  static bool EquelMethods(MethodInfo method1, MethodInfo method2) { var find = method1.DeclaringType.GetMethod(method2.Name, method2.GetParameters().Select(p => p.ParameterType).ToArray()); return find != null; }