我正在尝试创建一个简单的记录器,记录另一个类的所有方法调用。这将包括来自同一类中的方法的调用,例如递归调用。
(虽然有"记录传入方法调用观察类"的答案,但我无法找到答案"记录从观察到的类到自身的方法调用&#34 34;如果另一个答案没有解决这个问题,请不要重复关闭)
最简单的解决方案是使用装饰器,如下所示:
class Program
{
static void Main(string[] args)
{
new LoggerDecorator(new Observed()).Do();
}
}
public class Observed
{
public void Do()
{
Console.WriteLine("Do");
}
}
public class LoggerDecorator : Observed
{
private Observed _subject;
public LoggerDecorator(Observed subject)
{
_subject = subject;
}
public void Do()
{
Console.WriteLine("Log: Start Do");
_subject.Do();
Console.WriteLine("Log: End Do");
}
}
这成功记录了从Main到被观察班级的呼叫。方法:
Log: Start Do
Do
Log: End Do
现在,假设我们添加了一个方法Observed.DoTwice()
public void DoTwice()
{
Do();
Do();
}
和相应的记录器:
public void DoTwice()
{
Console.WriteLine("Log: Start DoTwice");
_subject.DoTwice();
Console.WriteLine("Log: End DoTwice");
}
现在我们记录从Main到DoTwice的所有呼叫,但不记录从DoTwice到Do的两个呼叫:
Log: Start DoTwice
Do
Do
Log: End DoTwice
我想要的是这样的:
Log: Start DoTwice
Log: Start Do
Do
Log: End Do
Log: Start Do
Do
Log: End Do
Log: End DoTwice
当然,它不能像这样工作,因为DoTwice调用它自己的 Do方法,而不是装饰器中的重写方法(它甚至不知道装饰器' s存在)。由于装饰器不起作用,我试图用Unity拦截做同样的事情,但它给出了相同的结果。
有谁知道如何实现这一目标?