记录覆盖方法的最佳方法

时间:2015-11-11 07:13:44

标签: c#

DotNetPerls

为例
class A
{
    public virtual void Y()
    {
        Console.WriteLine("A.Y");
    }
}

class B : A
{
    public override void Y()
    {
        Console.WriteLine("B.Y");
    }
}

如何安全地调用Y方法中的方法,例如,记录某些操作,而无需编辑每个实现?

我知道virtual使方法可以覆盖,并且除非你使用base调用者,否则永远不会调用原始方法,我还调查了一下PostSharp但似乎没有在这里帮忙......

只是为了记录一些调用而不需要编辑每个调用,只是试着解决问题:(

2 个答案:

答案 0 :(得分:4)

将公共接口和继承人的义务分为两种方法:

class A
{
    public void Y()
    {
        Console.WriteLine("Y about to happen");
        InnerY();
        Console.WriteLine("Y happened");
    }
    protected virtual void InnerY()
    {
    }
}

class B : A
{
    protected override void InnerY()
    {
        //No need to log - already done
    }
}

答案 1 :(得分:0)

您可以使用StackTrace获取当前(或调用)方法的信息以及它所驻留的对象的信息。

public class A
{
    public virtual string Y()
    {
        return Log.GetMethodName();
    }
}

public class B : A {
    public override string Y()
    {
        return Log.GetMethodName();
    }
}

public class Log
{
    public static string GetMethodName()
    {
    var st = new StackTrace();
    var sf = st.GetFrame(1);
    var method = sf.GetMethod();
        return method.DeclaringType.Name +"."+ method.Name;
    }
}