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

C# 基于变量值的动态调度方法,c#,methods,polymorphism,dynamic-dispatch,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. 这将取代

长的开关常不受欢迎。解决方案是使用多态性。但是,如果我打开的不是类型代码怎么办?我想做的是用如下内容替换switch语句

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

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

...
HandleString("Hello"); // results in the first method being called.
这将取代以下内容

string s = "Hello";

switch(s)
{
   case "Hello":
   ...
   break;
   case "Goodbye":
   ...
   break;
   default;
   break;
}

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

如果有大量选项,将来很有可能会有更多,或者您只需要让系统易于扩展,然后您就可以始终使用显式分派表:

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);
字典操作=
新字典()
{
{“你好”,Handlehallo},
{“再见”,HandleGoodbye}
};
私有静态void HandleHello(字符串s){…}
私有静态void HandleGoodbye(字符串s){…}
...
行动;

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

有一些语言实现这种语义。我熟悉的一个是来自Phillips的名为Grateate的编译器生成器工具

在这样的语言中,简单的阶乘算法可能如下所示:

fact (value : Int) : Int
    conditions value < 0
{
    { "Illegal input value\n" } astype Message
    return 0
}

fact (value = 0) : Int
{
    return 0
}

fact (value = 1) : Int
{
    return 1
}

fact (value : Int) : Int
{
    return value * fact(value - 1);
}
事实(值:Int):Int
条件值<0
{
{“非法输入值\n”}aType消息
返回0
}
事实(值=0):Int
{
返回0
}
事实(值=1):Int
{
返回1
}
事实(值:Int):Int
{
返回值*事实(值-1);
}

Common Lisp是一种相对知名的语言,它允许在特定的值(以及其他地方常见的类型)上分派方法。当然可以,但我宁愿让语言为我实现它。