将事件添加到类方法?

Cod*_*key 0 c# methods events delegates

好的,我已经尝试过,但我只是不明白.

我有两个类loggerclass1.

我有一个名为logger.Write(string)和方法的方法class1.Execute().

现在在我的应用程序中,我希望logger.Write(class1.ToString())class1.Execute()调用时运行.

我认为你需要添加代表和事件,但我无法理解这一点,已经抓了几个小时.

有一件事是,记录器和类在不同的命名空间中,如果可能的话,我不想更新其中任何一个的类代码.

Jon*_*eet 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
    }
}
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)

然后只需在"真实"实现中使用该包装器,无论您当前只使用该实现.