好吧,你肯定不能在不改变任何一个类的代码的情况下做到这一点(假设你也不想改变调用的所有地方class1.Execute) - 至少没有一些深层代码编织/仪器魔术.但是,您可以相当轻松地添加事件Class1:
public class Class1
{
// TODO: Think of a better name :)
public event EventHandler ExecuteCalled = delegate {};
public void Execute()
{
ExecuteCalled(this, EventArgs.Empty);
// Do your normal stuff
}
}
Run Code Online (Sandbox Code Playgroud)
这个delegate{}位只是为了确保始终至少注册了一个无操作事件处理程序 - 这意味着您不需要检查是否存在无效.
然后,您可以通过编写来连接它:
Class1 class1 = new Class1();
Logger logger = new Logger();
class1.ExecuteCalled += (sender, args) => logger.Write(sender.ToString());
Run Code Online (Sandbox Code Playgroud)
(这假设您正在使用C#3,因此您可以使用lambda表达式 - 如果情况不是这样,请告诉我.)
如果Class1实现了一个接口(比如说IFoo),你可能想要编写一个包含另一个实现的接口实现,并在每次调用之前记录:
public sealed class LoggingFoo : IFoo
{
private readonly IFoo original;
private readonly IFoo logger;
public LoggingFoo(IFoo original, Logger logger)
{
// TODO: Check arguments for nullity
this.original = original;
this.logger = logger;
}
// Implement IFoo
public void Execute()
{
logger.Write("Calling Execute on {0}", original);
original.Execute();
}
}
Run Code Online (Sandbox Code Playgroud)
然后只需在"真实"实现中使用该包装器,无论您当前只使用该实现.