1

例を挙げて、私が聞きたいことを説明してみましょう。

Func1、、、などの関数があるとFunc2Fucn3ます。これらの関数はすべて同じ署名を持っています。次に、この別の機能がありますCall(String str)。に渡されたパラメータに基づいてCall、3 つの関数のいずれかを呼び出します。つまり、str == "Func1"Func1 を呼び出す場合str == "Func2"、Func2 を呼び出す場合、Func3 を呼び出す場合str == "Func3"などです。条件文を使わずにこれを行う方法はありますか?

4

5 に答える 5

2

これにはポリモーフィズムを使用できます。

同じインターフェイスを実装するクラスがいくつかある場合、動作は渡されたオブジェクトにカプセル化されるため、必要な動作を持つオブジェクトを関数に渡して直接呼び出すことができます。

例と詳細については、戦略パターンを参照してください。

于 2012-09-14T09:00:31.487 に答える
2

これを実現する 1 つの方法は、ある種のテーブル ルックアップです。

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

もう 1 つの方法は、リフレクションを使用することです。

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

デリゲートも使用できます。サンプルコード

   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 に答える
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コンパイラがどれほど賢いかによって異なります (私はそれを調べたことはありませんが、今では非常に興味があります)。

もう 1 つのアプローチは、Perl からアイデアを借りることです。 を作成し、Dictionary<string, Func<Whatever>>それにさまざまなキー値のエントリを追加すると、必要なときに必要な関数オブジェクトを検索できます。

于 2012-09-14T08:58:32.340 に答える
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 に答える