确定Equals()是否为覆盖?

时间:2010-09-02 17:29:54

标签: c# reflection testing override equals

我有一个Type(type)的实例。如何确定它是否覆盖Equals()?

2 个答案:

答案 0 :(得分:6)

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 :(得分:0)

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