我正在努力解决这个新的代表处理程序的问题.
对我来说这似乎是正确的解决方案,但我不能把所有东西都绑起来.
我会尽力解释我想要达到的目标.
首先,我使用的是.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”作为第一个参数.有办法做到这一点,但它们有点复杂.