接受方法的包装器(EventArgs)

时间:2011-11-18 06:14:26

标签: c# delegates eventargs

我正在尝试实现EventArgs以将参数列表传递到我的消息传递系统:Question

我将EventArgs子类化:

public class SingleParameterArgs<T> : EventArgs
{
    public T arg1;

    public SingleParameterArgs(T _arg1)
    {
        arg1 = _arg1;
    }
}

这是应该接受EventArgs的类和方法:

static public class Messenger<TEventArgs> where TEventArgs : EventArgs {
    private static Dictionary< string, EventHandler<TEventArgs> > eventTable = new Dictionary< string, EventHandler<TEventArgs> >();

    static public void Invoke(string eventType, TEventArgs args) {
        EventHandler<TEventArgs> eventHandler;

        if (eventTable.TryGetValue(eventType, out eventHandler)) {          
            if (eventHandler != null)
                eventHandler();
        }
    }

}

在实现EventArgs之前,我将通过以下方式调用消息:

Messenger<GameEndingType>.Invoke( "end game", GameEndingType.TimeEnded );

但现在它看起来更长,更复杂:

Messenger< SingleParameterArgs<GameEndingType> >.Invoke( "end game", new SingleParameterArgs<GameEndingType>(GameEndingType.TimeEnded) );

是否可以让它看起来更短?每次我需要发送消息时,我都不想输入这么长的行。也许我可以创建一个包装器? 像这样的东西是完美的:     Messenger.Invoke(“结束游戏”,GameEndingType.TimeEnded);

为随机数量的参数创建统一包装器的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

您对Messenger课程与SingleParameterArgs<T>绑定感到高兴吗?如果是这样,您可以使用:

// Here TEventArgs represents the element type *within* SingleParameterArgs
public static class Messenger<TEventArgs> {
    private static
        Dictionary<string, EventHandler<SingleParameterArgs<TEventArgs>> eventTable = 
            new Dictionary<string, EventHandler<SingleParameterArgs<TEventArgs>>();

    public static void Invoke(string eventType, TEventArgs args) {
        EventHandler<SingleParameterArgs<TEventArgs>> eventHandler;

        if (eventTable.TryGetValue(eventType, out eventHandler)) {          
            if (eventHandler != null) {
                eventHandler();
            }
        }
    }
}

当然,你可以同时拥有一个完全通用的Messenger类(根据你的问题),然后是一个代表它的SingleParameterMessenger类:

public static class SingleParameterMessenger<TEventArgs> {
    public static void Invoke(string eventType, TEventArgs args) {
        Messenger<SingleParameterArgs<TEventArgs>>.Invoke(eventType, args);
    }
}

除此之外,我并不确定这无论如何都不是一个好主意 - 特别是在静态注册方面,这往往会使测试变得更加困难,当然需要更多的关注在并发方面。 (您的代码目前线程安全。)