好的,我已经尝试了但是我没有得到它。
我有两个课程logger
和class1
。
我有一个名为logger.Write(string)
的方法和名为class1.Execute()
的方法。
现在,在我的应用程序中,我想在调用logger.Write(class1.ToString())
时运行class1.Execute()
。
我认为你需要添加代表和事件,但我无法理解这一点,已经抓了几个小时。
有一件事是,记录器和类在不同的命名空间中,如果可能的话,我不想更新其中任何一个的类代码。
答案 0 :(得分:6)
嗯,如果不改变任何一个类中的代码,你当然不能这样做(假设你也不想改变调用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
}
}
delegate{}
位只是为了确保始终至少注册了一个no-op事件处理程序 - 这意味着你不需要检查是否为null。
然后你可以写下:
Class1 class1 = new Class1();
Logger logger = new Logger();
class1.ExecuteCalled += (sender, args) => logger.Write(sender.ToString());
(这假设您使用的是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();
}
}
然后只需在“真实”实现中使用该包装器,无论您当前只使用该实现。
答案 1 :(得分:2)
你能为logger传递一个object参数,然后只调用ToString吗?将调用正确的ToString方法。如果你不想在logger或class1中更改任何内容,那么你可以编写一个扩展方法并调用它而不是调用class1.Execute。此方法将调用logger,然后调用class1.Execute。
public static ExecuteAndLog(this class1 obj)
{
logger.Write(obj.ToString());
obj.Execute();
}
然后你只需要调用obj.ExecuteAndLog();
答案 2 :(得分:0)
您需要为EventHandler
Class1
public event EventHandler OnExecute;
并在你的执行方法中:
public void Execute()
{
//...
if (OnExecute != null)
OnExecute(this, null);
}
然后当你在别处使用class1时,那就是你放置事件的地方;
private Class1 class1 = new Class1();
class1.OnExecute += SomeMethodName;
public void SomeMethodName(sender obj, EventArgs e)
{
logger.Write(class1.ToString());
}
如果您想了解更多信息,我们可以自定义EventHandlers
,但对于准系统无参数事件,这应该有用。