[解決済み] 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<>
.
関連
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み] 辞書を値で並べ替えるにはどうしたらいいですか?
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] 与えられたキーがすでに辞書に存在するかどうかをチェックする
-
[解決済み] Pythonの辞書からキーを削除するにはどうしたらいいですか?
-
[解決済み] 辞書のリストを辞書の値でソートするにはどうしたらいいですか?
-
[解決済み] 辞書から要素を削除する
-
[解決済み] 2つのリストを辞書に変換するにはどうしたらいいですか?
-
[解決済み] リスト内包型辞書の作成
-
[解決済み] 辞書をキーでソートするにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー