尝试将委托和处理程序设置为仅使用操作键进行动态调用

本文关键字:操作 调用 动态 设置 程序 处理 | 更新日期: 2023-09-27 18:35:44

我正在努力解决这个对我来说是新的代表+处理程序的事情。这对我来说似乎是正确的解决方案,但我不能把所有事情都绑起来。

会尽力解释我想要实现的目标。

首先,我使用的是.NET 4.0框架+光子服务器(用于多人游戏)(不需要光子经验来回答我)

所以实际上,现在发生的事情是,客户端(游戏)向我的服务器发送操作,我必须识别并根据我收到的操作代码在我的服务器上调用某个函数。

这是它现在的样子:

switch (operationRequest.OperationCode)
        {
            case 1:
                if (operationRequest.Parameters.ContainsKey(1))
                {
                    Log.Debug("Received: " + operationRequest.Parameters[1]);
                    OperationResponse response = new OperationResponse(operationRequest.OperationCode);
                    response.Parameters = new Dictionary<byte, object> {{1, "Response Received"}};
                    SendOperationResponse(response, sendParameters);
                    Flush();
                }
                break;
        }

这实际上对我来说很好用。但是,我肯定知道会有200 +操作代码。切换所有这些并不是很好,最好调用分配给该操作代码的函数(处理程序)。

据我所知,在这里委托派上用场。

我想要一个字典,它存储"字节,处理程序"

 where "byte" is operation code
 where "Handler" is a delegate to the function

我假设类似的东西:

byte operationCode = operationRequest.OperationCode; 
if(dictionary.ContainsKey((operaionCode)) {
    dictionary[operationCode](someArguments);
}

从这一点来看,我完全困惑了。

如何创建这样的字典,如何

创建处理程序,假设我想将它们存储在不同的类中,如何委托它们并存储在字典中。

这是我朋友对我的建议(然后消失了一个星期,所以我不能再问他了):

  1. 创建词典

    Dictionary<byte, name> = new Dictionary<byte, name>();
    
  2. 将处理程序添加到该字典

    dict.Add(operationCode, MoveUnit);
    
  3. 初始化委托(在哪里!?

    ???
    
  4. 定义处理程序

    private void MoveUnit(SendParameters sendParameter) {...}
    

如果......任何人,在任何机会,有这个想法,请帮助我。

感谢大家花时间阅读本文。

尝试将委托和处理程序设置为仅使用操作键进行动态调用

假设所有方法都采用SendParameters,那么你真的需要:

private static readonly Dictionary<int, Action<SendParameters>> Actions = 
    new Dictionary<int, Action<SendParameters>>
{
    { 1, MoveUnit },
    { 2, AttackUnit }
};
...
static void HandleRequest(Request request)
{
    Action<SendParameters> action;
    if (Actions.TryGetValue(request.OperationCode, out action))
    {
        action(request.Parameters);
    }
}
static void MoveUnit(SendParameters parameters)
{
}
static void AttackUnit(SendParameters parameters)
{
}

对于实例方法来说,它变得稍微棘手 - 静态字典不知道实例,因此让操作采用实例可能是有意义的。假设这在一个名为 Foo 的类中,您可能需要类似的东西:

private static readonly Dictionary<int, Action<Foo, SendParameters>> Actions = 
    new Dictionary<int, Action<Foo, SendParameters>>
{
    { 1, (foo, parameters) => foo.MoveUnit(parameters) },
    { 2, (foo, parameters) => foo.AttackUnit(parameters) }
};
private void MoveUnit(SendParameters parameters)
{
}

诚然,它有点丑...您确实希望能够构建隐式将"this"作为第一个参数的委托。有一些方法可以做到这一点,但它们有点复杂。