web-dev-qa-db-ja.com

関数ポインタをC#に格納する方法

関数ポインタのグループをList<(*func)>に格納し、後でそれらを、おそらくパラメータを使用して呼び出すとしましょう... Dict<(*func), object[] params>に格納した場合のように呼び出すことができますパラメータ付きの関数?どうすればよいですか?

19
y2k

.NETは、関数ポインターの代わりにデリゲートを使用します。デリゲートインスタンスは、他の種類のオブジェクトと同じように、辞書などに保存できます。

MSDNのC#プログラミングガイドの Delegates を参照してください。

34
John Saunders

あなたは絶対に関数の辞書を持つことができます:

Dictionary<string, Action<T>> actionList = new Dictionary<string, Action<T>>();
Dictionary<string, Func<string>> functionList = new Dictionary<string, Func<string>>();

actionList.Add("firstFunction", ()=>{/*do something;*/});
functionList.Add("firstFunction", ()=>{return "it's a string!";});

次に、次のようなメソッドを呼び出すことができます。

string s = functionList["firstFunction"].Invoke();
22
Dave Swersky

デリゲートに関するC#のドキュメントを見てください。これはC#で関数ポインターに相当します(プレーンな関数ポインターであるか、このパラメーターを指定するために一度カレーされる可能性があります)。あなたに役立つ情報がたくさんあります。

8
Ben Voigt

これを行うにはいくつかの方法があります。他の人がデリゲートを使用して提案したように、それを行うことができます。しかし、辞書を機能させるには、すべて同じ署名が必要です。

var funcs = new Dictionary<Action<object[]>, object[]>();

または、署名が異なる場合は、次のような実際の反映方法を使用できます。

var funcs = new Dictionary<MethodInfo, object[]>();
2
Nick Berardi

デリゲートまたはイベントを使用します(使用法によって異なります)。

2
Danny Varod