MethodInfo Equality for Declaring Type
我需要检查两个方法信息之间的相等性。它们实际上是完全相同的MethodInfo,但ReflectedType除外(即,DeclaringType是相同的,方法实际上应该具有相同的主体)。有很多方法可以做到这一点,但我正在寻找最有效的方法。
现在我有:
1 2 3 4 5 6 | 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; } |
这有点贵,所以我想知道有没有更好的方法…
我应该比较两个方法体吗?如。
1 | first.GetMethodBody() == second.GetMethodBody() |
谢谢。
我想我会留下我的答案作为问题的答案…
有一点需要注意:
1 | first.GetMethodBody() == second.GetMethodBody() |
不起作用……所以我迄今为止找到的唯一答案是:
1 2 3 4 5 6 | 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和模块会有帮助吗?
metadatatoken的文档将其描述为:"一个与模块结合使用的值,它唯一地标识一个元数据元素。"
到目前为止,我发现它在比较除ReflectedType MemberInfo实例之外的Equal。但我并没有测试它是否有泛型方法定义这样的情况。
当您尝试相等的类和接口方法时,此代码有效:
1 2 3 4 5 | static bool EquelMethods(MethodInfo method1, MethodInfo method2) { var find = method1.DeclaringType.GetMethod(method2.Name, method2.GetParameters().Select(p => p.ParameterType).ToArray()); return find != null; } |