将事件添加到类方法?

时间:2009-06-11 06:21:39

标签: c# events delegates methods

好的,我已经尝试了但是我没有得到它。

我有两个课程loggerclass1

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

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

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

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

3 个答案:

答案 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,但对于准系统无参数事件,这应该有用。