1. ホーム
  2. c#

[解決済み] C# 関数を辞書に格納する

2023-01-12 01:54:46

質問

関数を格納する辞書を作成するにはどうしたらよいですか?

ありがとうございます。

私は、ユーザーから実行できる約30以上の関数を持っています。このように関数を実行できるようにしたいのですが。

   private void functionName(arg1, arg2, arg3)
   {
       // code
   }

   dictionaryName.add("doSomething", functionName);

    private void interceptCommand(string command)
    {
        foreach ( var cmd in dictionaryName )
        {
            if ( cmd.Key.Equals(command) )
            {
                cmd.Value.Invoke();
            }
        }
    }

しかし、関数のシグネチャは常に同じとは限らないので、引数の量も異なります。

どのように解決するのですか?

このように

Dictionary<int, Func<string, bool>>

これにより、文字列をパラメータとして受け取り、ブール値を返す関数を格納することができます。

dico[5] = foo => foo == "Bar";

あるいは、関数が匿名でない場合。

dico[5] = Foo;

ここで、Fooはこのように定義されています。

public bool Foo(string bar)
{
    ...
}


UPDATEです。

あなたの更新を見た後、あなたが呼び出したい関数のシグネチャを事前に知らないようです。.NETでは、関数を呼び出すにはすべての引数を渡す必要があり、引数が何であるかがわからない場合、これを達成する唯一の方法はリフレクションを使用することです。

そして、ここにもう一つの選択肢があります。

class Program
{
    static void Main()
    {
        // store
        var dico = new Dictionary<int, Delegate>();
        dico[1] = new Func<int, int, int>(Func1);
        dico[2] = new Func<int, int, int, int>(Func2);

        // and later invoke
        var res = dico[1].DynamicInvoke(1, 2);
        Console.WriteLine(res);
        var res2 = dico[2].DynamicInvoke(1, 2, 3);
        Console.WriteLine(res2);
    }

    public static int Func1(int arg1, int arg2)
    {
        return arg1 + arg2;
    }

    public static int Func2(int arg1, int arg2, int arg3)
    {
        return arg1 + arg2 + arg3;
    }
}

この方法でも、各関数に渡すべきパラメータの数と種類を、辞書の対応するインデックスで知っておく必要があり、さもなければランタイムエラーが発生します。また、関数が戻り値を持たない場合は System.Action<> の代わりに System.Func<> .