避免大量使用自定义的EventArgs?

4

我正在重构的类库有大量事件(超过50个),每个事件都有自己的Delegate,尽管许多事件具有相同的参数。我开始将它们全部更改为使用EventHandler和自定义EventArgs,但这证明是一项繁琐费时的工作。

当你有大量事件需要处理时,有没有更简单的方法?

2个回答

6

您不一定需要自己的委托类型 - 您可以使用 EventHandler<TEventArgs>,其中TEventArgs是您特定的EventArgs子类。

重构一个庞大混乱的代码总是耗时且令人烦恼。但如果您改用方法组转换,将来会更容易些:

// This...
foo.SomeEvent += new MyCustomEventHandler(SomeMethod);

// becomes this..
foo.SomeEvent += SomeMethod;

如果SomeEvent的类型发生变化,您只需更改SomeMethod,订阅就可以正常工作,而无需再次更改。

是否需要多个不同的EventArgs子类型是另一回事——如果不了解您的特定情况,就无法确定。如果您需要传递各种各样的信息,这可能确实有意义。


谢谢,我想我只需要仔细审视所有这些委托。 - Brian Ortiz

2

我使用类似下面的模板化事件参数类,以避免创建大量定制的事件参数类。

public class MessageEventArgs<T> : EventArgs
{
    public MessageEventArgs(T message)
    {
        Message = message;
    }

    public T Message
    {
        get;
        private set;
    }
}

我曾经考虑过这个,但感觉它失去了事件参数的期望“含义” - 因为值只是“message”,而不是“UserID”,“ErrorCode”或其他什么。当然,它可能实现了问题中所述的目标 - 我只是不确定这是否是一个好的实现方式。你需要为每个元数(arity)使用一个通用类型 - 例如 MessageEventArgs<T>MessageEventArgs<T1, T2> 等等... 除非你在 .NET 4 上使用 MessageEventArgs<Tuple<string,string>>。那时候,EventHandler<T> 就变得可怕了 ;) - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接