c# – 尝试设置委托和处理程序,仅使用操作键动态调用

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

我会尽力解释我想要达到的目标.

首先,我使用的是.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个操作码.
切换所有这些并不是很好,最好调用分配给该操作代码的函数(处理程序).

根据我的知识,这里代表派上用场.

我想要一个Dictonary,存储“byte,Handler”

 where "byte" is operation code

 where "Handler" is a delegate to the function

我认为这样的事情:

byte operationCode = operationRequest.OperationCode; 

if(dictionary.ContainsKey((operaionCode)) {
    dictionary[operationCode](someArguments);
}

从这一点来说,我完全糊涂了.

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

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

>创建一个字典

Dictionary<byte, name> = new Dictionary<byte, name>();

>为该词典添加处理程序

dict.Add(operationCode, MoveUnit);

>初始化代表(Where!?)

???

>定义处理程序

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”作为第一个参数.有办法做到这一点,但它们有点复杂.

上一篇:c# – Azure /映像请求502(错误网关)错误 – 间歇性


下一篇:python – 日志处理程序使用单独的线程吗?