4

我正在为这个对我来说新的 Delegates + Handlers 事情而苦苦挣扎。这对我来说似乎是正确的解决方案,但我无法将所有内容都捆绑起来。

将尽我所能解释我想要实现的目标。

首先,我使用的是.NET 4.0 Framework + Photon Server(多人游戏)(不需要有Photon经验才能回答我)

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

这是它现在的样子:

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) {...}
    

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

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

4

1 回答 1

3

假设所有方法都采用 a 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”作为第一个参数的委托。有一些方法可以做到这一点,但它们有点复杂。

于 2012-05-29T20:18:08.840 回答