1

让我举个例子并尝试解释我想问的问题:

假设我有名为Func1, Func2, Fucn3... 的函数,等等。所有这些功能都具有相同的签名。然后,还有这个其他功能Call(String str)。现在基于传递给的参数Call,我想调用三个函数之一。即如果str == "Func1"调用 Func1,如果str == "Func2"调用 Func2,如果str == "Func3"调用 Func3 ... 等等。有没有办法在不使用条件语句的情况下做到这一点?

4

5 回答 5

2

您可以为此使用多态性。

如果您有几个实现相同接口的类,您可以将具有您想要的行为的对象传递给您的函数并直接调用它,因为该行为将封装在传入的对象中。

有关示例和详细信息,请参阅策略模式

于 2012-09-14T09:00:31.487 回答
2

实现此目的的一种方法是某种表查找:

//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");
    }
}

第一种方法有点冗长,但是您可以完全控制将哪些函数映射到哪些字符串。后一种方法需要较少的代码,但应谨慎使用。

于 2012-09-14T09:02:39.823 回答
1

if-else在这些情况下,通常的替代方法是switch. 例如:

switch (str) {
    case "Func1": Func1(); break;
    case "Func2": Func2(); break;
    default:
        throw new ArgumentException("Unrecognised function name", "str");
        break;
}

这可能会或可能不会产生比一系列更有效的代码ifelse if具体取决于编译器的智能程度(我从未研究过它,尽管我现在很感兴趣)。

另一种方法是从 Perl 中借用一个想法:创建一个Dictionary<string, Func<Whatever>>并为其添加不同键值的条目,然后您可以在需要时在其中查找所需的函数对象。

于 2012-09-14T08:58:32.340 回答
1

您也可以使用代表。示例代码

   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;
    }
} 
于 2012-09-14T09:06:36.377 回答
0

您可以为其使用 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
于 2012-09-14T08:59:55.727 回答