响应网络代码调用函数

时间:2014-01-13 12:27:59

标签: c#

我想知道,在尝试处理从网络源接收的代码时,如何避免使用巨大的switch语句?消息带有一个操作码(int),根据前面提到的操作码调用函数(不是我的设计,我不能影响它)。

我需要调用一个函数来响应操作码,但是我不一定要使用switch语句将操作码硬编码到函数映射,因为这会使它变得僵硬且很难修复网络架构变化。

tldr如何将int绑定到函数 - 注意函数可能分布在整个解决方案中(每条消息可能需要不同的状态信息/可能属于不同的类)现在我已经用属性标记了函数,但是有更好的方法吗?

3 个答案:

答案 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来填充字典,这样你就不必硬编码任何东西。