I have an instance of Type (type). How can I determine if it overrides Equals()?
+5
A:
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));
}
Note that this reveals whether object.Equals
has been overridden anywhere in the inheritance hierarchy of type
. To determine if the override is declared on the type itself, you can change the condition to
equalsMethod.DeclaringType.Equals(type)
EDIT:
Cleaned up the IsObjectEqualsMethod
method.
Ani
2010-09-02 17:37:10
I'm curious why you use the Linq with the IsObejectEqualsMethod when you could call type.GetMethod("Equals", new Type[] { typeof(object } )Is there some benefit or behavior I'm missing? Or is it just to be Linq-y?
Hounshell
2010-09-04 10:45:32
@Hounshell: For a second, I was wondering why myself, but I just remembered. If the type contains a hiding `public new bool Equals(object obj)`, we would be reasoning about the wrong method. I agree the current technique I am using to deal with this is not great, but do you know of a better solution?
Ani
2010-09-04 11:35:09
A:
If you enumerate all methods of a type use BindingFlags.DeclaredOnly so you won't see methods which you just inherited but not have overridden.
codymanix
2010-09-02 17:38:28