6

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

「メソッド」は「変数」ですが、「メソッド」のように使用されます

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

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);
}

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

4

7 に答える 7

15

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);
}
于 2008-09-25T19:29:48.953 に答える
3

.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)
于 2008-09-25T19:32:31.897 に答える
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));
于 2008-09-25T19:34:26.027 に答える
1

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

于 2008-09-25T20:44:07.777 に答える
1

私は Khoth の実装の方が気に入っていますが、コンパイラ エラーの原因は、呼び出す前にメソッドを BinaryOp にキャストしていないことだと思います。foreach ループでは、それは単なる「オブジェクト」です。foreach を Khoth のように変更すると、うまくいくと思います。

于 2008-09-25T19:36:51.200 に答える
0

IExecuteable などの共通インターフェイスをすべて実装してから、List<IExecutable> を用意します。

また、デリゲートを使用して:

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;
    }
}
于 2008-09-25T19:28:45.947 に答える
0

試したことはありませんが、 List< Action< t>> タイプを使用するとできるはずです。

于 2008-09-25T19:29:45.477 に答える