接受(EventArgs)的方法的包装器

本文关键字:方法 包装 EventArgs 接受 | 更新日期: 2023-09-27 18:14:58

我正在尝试实现EventArgs传递参数列表到我的消息传递系统:问题。

我子类化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) );

能不能让它看起来短一点?我不想每次发信息都要打这么长的一行。也许我可以创建一个包装器?像这样的东西将是完美的:信使。调用("end game", GameEndingType.TimeEnded);

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

接受(EventArgs)的方法的包装器

您愿意您的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);
    }
}
作为题外话,我不确定这是不是一个好主意——特别是在静态注册方面,这往往会使测试变得更加困难,而且在并发性方面当然需要更多的注意。(你的代码目前不是 threadsafe.)