根据这个答案,在不知道确切的派生或基类型的情况下,还可以通过测试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
方法。
就我目前的测试来看,似乎可以正常工作(在我的机器上™)。