基于变量值的动态方法调度

Ian*_*ton 3 c# methods polymorphism dynamic-dispatch

长开关的声明往往令人不悦.解决方案是使用多态.但是,如果我正在打开的东西不是类型代码呢?我想做的是用这样的东西替换switch语句......

public void HandleString(string s = "Hello")
{
 ...
}

public void HandleString(string s = "Goodbye")
{
 ...
}

...
HandleString("Hello"); // results in the first method being called.
Run Code Online (Sandbox Code Playgroud)

这将取代以下......

string s = "Hello";

switch(s)
{
   case "Hello":
   ...
   break;
   case "Goodbye":
   ...
   break;
   default;
   break;
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?从理论上讲,我认为你可以完全取消'if/switch'语句,只调用基于表达式值自动绑定的方法.

Pav*_*aev 16

如果您有大量选项,并且很有可能将来会有更多 - 或者您只需要系统易于扩展 - 那么您始终可以使用显式调度表:

Dictionary<string, Action<string>> actions =
    new Dictionary<string, Action<string>>()
    {
        { "Hello", HandleHello },
        { "Goodbye", HandleGoodbye }
    };

private static void HandleHello(string s) { ... }

private static void HandleGoodbye(string s) { ... }

...

actions[s](s);
Run Code Online (Sandbox Code Playgroud)

您还可以通过允许API的外部客户端为给定字符串注册自己的处理程序来提供扩展表的方法.