让我们开始:

using System;

public class Program
{
    class A
    {
        public virtual void Do() { }
    }

    class B:A
    {
    }

    public static void Main()
    {
        var m1 = typeof(A).GetMethod("Do");
        var m2 = typeof(B).GetMethod("Do");

        Console.WriteLine("Methods are equal?\t\t{0}", m1 == m2);
        Console.WriteLine("Method handles are equal?\t{0}", m1.MethodHandle == m2.MethodHandle);

        Console.WriteLine("Done.");
        Console.ReadKey();
    }
}


(位于ideone的try it online

因此,有两个不相等的MethodInfo实例,它们都包含相同的方法句柄。这是the equals operator source

public static bool operator ==(MethodInfo left, MethodInfo right)
{
    if (ReferenceEquals(left, right))
        return true;

    if ((object)left == null || (object)right == null ||
        left is RuntimeMethodInfo || right is RuntimeMethodInfo) // <----???
    {
        return false;
    }
    return left.Equals(right);
}


它看起来似乎不是偶然的错误,至少直到假设RuntimeMethodInfo的所有实例都已缓存并且对于同一方法而言,会有两个不同的实例被更新为止。在那种情况下,很明显,东西坏了。

任何这种行为背后的原因,有人吗?

附言请不要将其标记为[重复] :)问题不是关于“如何比较?”。回答了多次,例如herehere

谢谢!

最佳答案

我相信您基于其推理的假设-可以通过引用相等性比较两个RuntimeMethodInfo实例-是正确的。您认为它已损坏的假设是不正确的。

这里的两个MethodInfo对象是不同的,因为它们具有不同的ReflectedType属性:

Console.WriteLine(m1.ReflectedType); // Program+A
Console.WriteLine(m2.ReflectedType); // Program+B

10-07 19:37