リストを使用できます< T>メソッドポインタのコレクションとして? (C#)

StackOverflow https://stackoverflow.com/questions/135451

  •  02-07-2019
  •  | 
  •  

質問

実行するメソッドのリストを作成したい。各メソッドには同じ署名があります。 デリゲートを汎用コレクションに入れることを考えましたが、このエラーが発生し続けます:

  

'method'は 'variable'ですが、 'method'のように使用されます

理論上、私がやりたいことは次のとおりです。

List<object> methodsToExecute;

int Add(int x, int y)
{ return x+y; }

int Subtract(int x, int y)
{ return x-y; }

delegate int BinaryOp(int x, int y);

methodsToExecute.add(new BinaryOp(add));
methodsToExecute.add(new BinaryOp(subtract));

foreach(object method in methodsToExecute)
{
    method(1,2);
}

これを達成する方法についてのアイデアはありますか? ありがとう!

役に立ちましたか?

解決

リスト内の object BinaryOp にキャストするか、リストに対してより具体的な型パラメーターを使用する必要があります。

delegate int BinaryOp(int x, int y);

List<BinaryOp> methodsToExecute = new List<BinaryOp>();

methodsToExecute.add(Add);
methodsToExecute.add(Subtract);

foreach(BinaryOp method in methodsToExecute)
{
    method(1,2);
}

他のヒント

.NET 3.0(または3.5?)を使用すると、汎用デリゲートがあります。

これを試してください:

List<Func<int, int, int>> methodsToExecute = new List<Func<int, int, int>>();

methodsToExecute.Add(Subtract);

methodsToExecute.Add[0](1,2); // equivalent to Subtract(1,2)
List<Func<int, int, int>> n = new List<Func<int, int, int>>();
            n.Add((x, y) => x + y);
            n.Add((x, y) => x - y);
            n.ForEach(f => f.Invoke(1, 2));

Khothの実装はより気に入っていますが、コンパイラエラーを引き起こしているのは、メソッドをBinaryOpに呼び出さないと呼び出せないためだと思います。 foreachループでは、これは単なる「オブジェクト」です。 foreachをKhothのように変更すると、うまくいくと思います。

このようなことをしたいときはいつでも、特にすべてのメソッドに同じパラメーターがあるため、コマンドパターンを使用するようにデザインをリファクタリングする方が一般に良いことがわかりました。これにより、柔軟性が大幅に向上します。

試してみましたが、リストを使用しました&lt;アクション&lt; t&gt;&gt; typeはそれができるはずです。

すべてに共通のインターフェイス(IExecuteableなど)を実装し、List&lt; IExecutable&gt;を用意します

また、デリゲートの使用:

class Example
{
    public delegate int AddDelegate(int x, int y);

    public List<AddDelegate> methods = new List<AddDelegate>();

    int Execute()
    {
        int sum = 0;
        foreach(AddDelegate method in methods)
        {
            sum+=method.Invoke(1, 2);
        }
        return sum;
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top