提出这个问题的行为表明我对这个问题的处理是不正确的,所以我对直接解决这个问题的答案感兴趣,以及对我正在做的事情采取更清晰方法的答案.
考虑一个基类,它提供一组标准的服务和功能,以及围绕这些服务和功能的一些结构.通过比喻,让我们考虑以下示例类:
public class ExampleBase
{
public void Main()
{
// Do something
PreValidate(); // Extensibility point for derived classes
// Do something else
PostValidate(); // Extensibility point for derived classes
// Do something else
}
protected virtual void PreValidate()
{
}
protected virtual void PostValidate()
{
}
}
Run Code Online (Sandbox Code Playgroud)
派生类现在可以覆盖这些虚方法以提供一些自定义逻辑.
下面是一个问题:在调用虚方法之前,基类是否有可能在运行时发现派生类是否可以自由地覆盖其中一个虚方法?
(如果在调用该方法后知道这个问题的答案就足够了,那么你可以用一个设置私有标志的方法替换基类中的空方法,这表明该方法没有被覆盖.但是这可能如果派生类base.PreValidate()在其重写的实现中调用,则会被欺骗.)
如果需要这种灵活性,最好的解决方案可能是使用完全不同的可扩展性机制?
虽然在其他答案中提到了解决此问题的最佳方法,但我回答问题标题(这将处理new问题):
var isOverridden =
new Action(MethodName).Method.DeclaringType != typeof(BaseClass);
// Replace `Action` with any conforming delegate type.
Run Code Online (Sandbox Code Playgroud)
这个技巧使CLR方法调度机制MethodInfo为我们找到,而不是求助于反射来找到它.