关于C#:用于声明类型的MethodInfo相等

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;
    }