确定Equals()方法是否被重写?

5

我有一个 Type (类型) 的实例。如何确定它是否重写了 Equals() 方法?


1
为什么你需要知道那个? - Matti Virkkunen
我只是在尝试使用反射,但是无法弄清楚它。我已经花费了我所有的时间预算,但现在我要把问题交给聪明的人了。 - lance
相关问题:https://dev59.com/53NA5IYBdhLWcg3wYMx- - Steve Guidi
@Matti - 单元测试也许是个好选择吧?了解一个类型是否应该重写Equals()但并未这样做可能会很有用。 - Doug
2个回答

8
private static bool IsObjectEqualsMethod(MethodInfo m)
{
    return m.Name == "Equals"
        && m.GetBaseDefinition().DeclaringType.Equals(typeof(object));
}

public static bool OverridesEqualsMethod(this Type type)
{
    var equalsMethod = type.GetMethods()
                           .Single(IsObjectEqualsMethod);

    return !equalsMethod.DeclaringType.Equals(typeof(object));
}

请注意,这将显示object.Equals是否已在type的继承层次结构的任何位置被重写。要确定覆盖是否在类型本身上声明,您可以更改条件为
equalsMethod.DeclaringType.Equals(type)

编辑: 清理了IsObjectEqualsMethod方法。


1
我很好奇为什么你使用Linq与IsObejectEqualsMethod,而不是调用type.GetMethod("Equals", new Type[] { typeof(object } )。我是否忽略了某些优点或行为?还是只是为了更Linq-y? - Hounshell
@Hounshell:一开始我也在想为什么,但是我现在想起来了。如果类型中包含一个隐藏的 public new bool Equals(object obj) 方法,我们就会推断错误的方法。我同意目前我使用的处理方法并不好,但你知道更好的解决方案吗? - Ani
很棒的答案。比我的答案要短得多,但仍然通过了我所有奇怪的测试用例。使用方法隐藏进行测试:http://nopaste.info/bd9b052f8d_nl.html - CodesInChaos

-1
如果您枚举类型的所有方法,请使用BindingFlags.DeclaredOnly,这样您就不会看到您刚刚继承但未覆盖的方法。

除了使用 BindingFlags.DeclaredOnly,你也看不到已被覆盖的方法。覆盖本身并不被认为是方法的“声明”;成员只能在最不派生的类型中声明一次,无论它在哪里出现。换句话说,这个答案完全没有回答问题。 - Peter Duniho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接