.net 声明类型的MethodInfo相等

h43kikqp  于 2023-05-02  发布在  .NET
关注(0)|答案(4)|浏览(119)

我需要检查两个MethodInfo是否相等。它们实际上是完全相同的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()

谢谢。

9udxz4iz

9udxz4iz1#

我想我的答案就作为这个问题的答案吧。..
有一点要注意:

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

qybjjes12#

比较MetadataTokenModule是否有帮助?
MetadataToken的文档将其描述为:“一个值,它与模块一起唯一地标识元数据元素。“
到目前为止,我发现它可以用于比较equal-except-for-ReflectedType MemberInfo示例。但是我没有在泛型方法定义这样的情况下测试它。

bttbmeg0

bttbmeg03#

这段代码在你试图将类和接口方法等同起来时有效:

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

9o685dep4#

这里的其他答案在处理泛型时会失败。
特别是,当以下情况之一为真时,它们将出现问题:
1.当具有相同参数的不同重载仅泛型计数不同时
1.将泛型方法定义与构造方法进行比较时
1.比较用不同类型参数构造的构造泛型方法时
以下是一个涵盖所有这些情况的解决方案:

static bool IsEqual(MethodInfo methodInfo, MethodInfo other)
{
    if (methodInfo.ReflectedType == other.ReflectedType) return methodInfo == other;
    if (methodInfo.DeclaringType != other.DeclaringType) return false;

    return methodInfo.Name == other.Name
        && methodInfo.GetParameters().Select(p => p.ParameterType)
               .SequenceEqual(other.GetParameters().Select(p => p.ParameterType))
        && methodInfo.GetGenericArguments()
               .SequenceEqual(other.GetGenericArguments());
}

相关问题