3

可変数の引数 (引数なしの場合もあれば、11 の場合もあります) を使用して匿名メソッドをインライン呼び出しできるようにしたいと考えています。

Dictionary<string, Action> ActionDic = new Dictionary<string, Action>();
int i = 0;
ActionDic["something"] = () => { i += 1; };           // this line is ok
ActionDic["somethingArgs"] = (int n) => { n += 1; };  // but this is not
    // Delegate 'System.Action' does not take 1 arguments

したがって、デリゲートにそのような引数を受け入れさせることはできません。私の構文は間違っていますか、それとも不可能ですか? または、辞書に使用する匿名メソッドのタイプを変更する必要がありますか?

4

4 に答える 4

4

Action<int>1 つの整数引数でデリゲートを定義する場合に使用できます。例えば:

Action<int> somethingArgs = (int n) => { n += 1; };

ActionDic変数が何であるかを示していませんが、変数の場合、引数を受け入れないIDictionary<string, Action>ため、これを機能させることはできません。Action

一方、デリゲートの辞書を使用することもできます。

IDictionary<string, Delegate> ActionDic = ...
ActionDic["something"] = (Action)(() => { i += 1; }); 
ActionDic["somethingArgs"] = (Action<int>)((int n) => { n += 1; });
于 2013-02-04T06:53:26.703 に答える
3

できません。ActionAction<T>は異なり、互換性のないデリゲート型です。

これを補う方法はいくつかあります。

1 つは、作成ActionDicするDictionary<string, Action<int>>ことですが、使用したい可能性のあるすべてのデリゲートを満たさない場合があります。

別の方法としてActionDica のようなものを作成するDictionary<string, Delegate>こともできますが、各関数に渡すパラメーター (およびその型) の数を正確に知る必要があるため、これを使用するのは面倒です。この情報は、別のデータ構造に格納する必要があります。

さらに 3 番目の方法は、 を作成ActionDicDictionary<string, Action<object[]>>、デリゲートが必要な引数を入力からアンパックすることを要求することです。呼び出し元は、使用する引数を正確に知る責任があります。これにより、2 番目のオプションのぎこちない構文がいくらか緩和されますが、各デリゲートでより多くのコードが必要になります。

于 2013-02-04T06:52:50.717 に答える
2

Action2 つの異なるデリゲート、つまりとについて話しているAction<T>Action<T>に割り当てることはできませんAction:

Action a1 = () => { i += 1; };
Action<int> a2 = (n) => { n += 1; };

を持っていると思いますDictionary<string,Action>ので、この辞書は の値を受け入れることができませんAction<T>

int補足として、2 番目のデリゲートは値渡しされた引数をインクリメントするため、実際には何もしていないため、まったく役に立たないと思います。

How To pass Optional Argumentsも読むことを検討してください。匿名メソッドとは何の関係もありませんが、可変数の引数を渡す方法についての手がかりが得られるかもしれません

于 2013-02-04T06:54:05.813 に答える
0

アクションは、void を返し、引数を取らないデリゲートを作成する簡単な方法です。引数付きのアクションが必要な場合は、ジェネリック形式を使用する必要があります:

Action<int>1 つの int パラメータを取るデリゲートです

Action<string, double>2 つのパラメータを取ります。1 つ目は文字列、2 つ目は double です。

于 2013-02-04T06:52:53.390 に答える