Согласно этому ответу также может быть простой способ проверить, был ли переопределен виртуальный метод, без знания точного производного или базового типа с помощью теста для атрибута MethodAttributes.NewSlot
:
public static bool HasOverride(this MethodInfo method)
{
return (method.Attributes & MethodAttributes.Virtual) != 0 &&
(method.Attributes & MethodAttributes.NewSlot) == 0;
}
Вместе с другим методом расширения
private const BindingFlags Flags = BindingFlags.NonPublic |
BindingFlags.Public | BindingFlags.Instance;
public static bool HasOverride(this Type type, string name, params Type[] argTypes)
{
MethodInfo method = type.GetMethod(name, Flags, null, CallingConventions.HasThis,
argTypes, new ParameterModifier[0]);
return method != null && method.HasOverride();
}
Вы можете просто позвонить
bool hasOverride = GetType().HasOverride(nameof(MyMethod), typeof(Param1Type),
typeof(Param2Type), ...);
чтобы проверить, переопределена ли MyMethod
в производном классе.
Насколько я это проверил, казалось, что он работает нормально (на моей машине ™).