我想知道,在尝试处理从网络源接收的代码时,如何避免使用巨大的switch语句?消息带有一个操作码(int),根据前面提到的操作码调用函数(不是我的设计,我不能影响它)。
我需要调用一个函数来响应操作码,但是我不一定要使用switch语句将操作码硬编码到函数映射,因为这会使它变得僵硬且很难修复网络架构变化。
tldr如何将int绑定到函数 - 注意函数可能分布在整个解决方案中(每条消息可能需要不同的状态信息/可能属于不同的类)现在我已经用属性标记了函数,但是有更好的方法吗?
答案 0 :(得分:3)
使用Dictionary
将int映射到处理程序:
var handlers=new Dictionary<int,Action<NetworkData>>();
handlers[Opcode.Foo]=HandleFoo;
handlers[Opcode.Bar]=HandleBar;
void HandleFoo(NetworkData data)
{
// Whatever
}
void HandleBar(NetworkData data)
{
// Whatever
}
答案 1 :(得分:1)
假设您的所有功能都具有相同的签名MyFunctionDelegate
,您可以使用Dictionary<int, MyFunctionDelegate>
将ints映射到方法。
如果操作码的范围从0到N且没有间隙,您也可以使用简单的数组或列表。
答案 2 :(得分:0)
肯定有几种不同的方法来处理它......但是,通常情况下,硬代码实际上会提供最快的输出。
但是,如果你可以处理一点额外的延迟(我肯定意味着一点......)你可以试试Dictionary<int, TMessage>
。
我建议类型TMessage
有一个方法可以自己读取它。意思是代码首先会读取“操作码”,用它来挑选TMessage
,然后将消息读入其余部分。
如果你想获得幻想...你可以使用reflection
来填充字典,这样你就不必硬编码任何东西。