让我举个例子并尝试解释我想问的问题:
假设我有名为Func1
, Func2
, Fucn3
... 的函数,等等。所有这些功能都具有相同的签名。然后,还有这个其他功能Call(String str)
。现在基于传递给的参数Call
,我想调用三个函数之一。即如果str == "Func1"
调用 Func1,如果str == "Func2"
调用 Func2,如果str == "Func3"
调用 Func3 ... 等等。有没有办法在不使用条件语句的情况下做到这一点?
实现此目的的一种方法是某种表查找:
//assuming your functions receive string and return int
Dictionary<string, Func<string, int>> methods = {
{"Func1", Func1},
{"Func2", Func2},
{"Func3", Func3}
}
void call(String input){
if (methods.HasKey(input)){
int result = methods[input]("I'm a parameter");
}
}
另一种方法是使用反射:
void call(String input){
var func = yourobject.GetType().GetMethod(input);
if (func!=null){
int result = func.Invoke(object, "I'm a parameter");
}
}
第一种方法有点冗长,但是您可以完全控制将哪些函数映射到哪些字符串。后一种方法需要较少的代码,但应谨慎使用。
if-else
在这些情况下,通常的替代方法是switch
. 例如:
switch (str) {
case "Func1": Func1(); break;
case "Func2": Func2(); break;
default:
throw new ArgumentException("Unrecognised function name", "str");
break;
}
这可能会或可能不会产生比一系列更有效的代码if
,else if
具体取决于编译器的智能程度(我从未研究过它,尽管我现在很感兴趣)。
另一种方法是从 Perl 中借用一个想法:创建一个Dictionary<string, Func<Whatever>>
并为其添加不同键值的条目,然后您可以在需要时在其中查找所需的函数对象。
您也可以使用代表。示例代码
delegate int Arithm(int x, int y);
public class CSharpApp
{
static void Main()
{
DoOperation(10, 2, Multiply);
DoOperation(10, 2, Divide);
}
static void DoOperation(int x, int y, Arithm del)
{
int z = del(x, y);
Console.WriteLine(z);
}
static int Multiply(int x, int y)
{
return x * y;
}
static int Divide(int x, int y)
{
return x / y;
}
}
您可以为其使用 switch 或 select 语句,如下所示
Between the button Sub and End Sub code add the folowing
Dim creamcake As String
Dim DietState As String
creamcake = TextBox1.Text
Select Case creamcake
Case "Eaten"
DietState = "Diet Ruined"
Case "Not Eaten"
DietState = "Diet Not Ruined"
Case Else
DietState = "Didn't check"
End Select
MsgBox DietState