C# 调用函数以响应网络代码

C# 调用函数以响应网络代码,c#,C#,我想知道,在处理从网络源收到的代码时,如何避免出现巨大的switch语句?消息带有一个操作码(int),调用的函数取决于前面提到的操作码(不是我的设计,我不能影响它) 我需要调用一个函数来响应操作码,但我不一定要使用switch语句硬编码操作码到函数的映射,因为如果网络模式发生变化,这将使它变得僵硬且难以修复 tldr如何将int绑定到函数-注意,函数可能分布在整个解决方案中(每条消息可能需要不同的状态信息/可能属于不同的类),现在我用属性标记函数,但是有更好的方法吗?使用字典将int映射到处理

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

我需要调用一个函数来响应操作码,但我不一定要使用switch语句硬编码操作码到函数的映射,因为如果网络模式发生变化,这将使它变得僵硬且难以修复


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

使用
字典
将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
}
var handlers=newdictionary();
handlers[Opcode.Foo]=HandleFoo;
handlers[Opcode.Bar]=把手;
void HandleFoo(网络数据)
{
//随便
}
无效把手(网络数据)
{
//随便
}

假设所有函数都具有相同的签名
MyFunctionDelegate
您可以使用一个将int映射到方法的
字典


如果操作码的范围为0到N,没有间隙,您也可以使用一个简单的数组或列表。

有几种不同的方法来处理它。。。然而,与通常一样,硬代码实际上会提供最快的输出

但是,如果你能处理一点额外的延迟(我的确切意思是一点…),你可以试试
字典

我建议类型
TMessage
应该有一个方法,能够在中读取其自身。这意味着代码将首先读取“操作代码”,使用它来选择
TMessage
,然后让消息读取其余部分


如果你想变得漂亮。。。你可以使用
reflection
来填充字典,这样你就不必硬编码任何东西了。

反射是属性用法:p这基本上就是我现在使用的。那么你就根本不需要硬编码了!添加消息时,
reflection
将能够将它们添加到
字典