Detect if a method was overridden using Reflection (C#)
I was unable to get Ken Beckett's proposed solution to work. Here's what I settled on:
public static bool IsOverride(MethodInfo m) {
return m.GetBaseDefinition().DeclaringType != m.DeclaringType;
}
There are tests in the gist.
Given the type Test1
, you can determine whether it has its own implementation declaration of TestMe
:
typeof(Test1).GetMethod("TestMe").DeclaringType == typeof(Test1)
If the declaration came from a base type, this will evaluate false.
Note that since this is testing declaration, not true implementation, this will return true if Test1
is also abstract and TestMe
is abstract, since Test1
would have its own declaration. If you want to exclude that case, add && !GetMethod("TestMe").IsAbstract
As @CiprianBortos pointed out, the accepted answer is not complete and will lead to a nasty bug in your code if you use it as-is.
His comment provides the magic solution GetBaseDefinition()
, but there's no need to check the DeclaringType
if you want a general-purpose IsOverride
check (which I think was the point of this question), just methodInfo.GetBaseDefinition() != methodInfo
.
Or, provided as an extension method on MethodInfo
, I think this will do the trick:
public static class MethodInfoUtil
{
public static bool IsOverride(this MethodInfo methodInfo)
{
return (methodInfo.GetBaseDefinition() != methodInfo);
}
}