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列表中的 转换为 a 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

我更喜欢 Khoth 的实现,但我认为导致编译器错误的原因是在尝试调用它之前没有将方法转换为 BinaryOp。在您的 foreach 循环中,它只是一个“对象”。将您的 foreach 更改为看起来像 Khoth 的,我认为它会起作用。

于 2008-09-25T19:36:51.200 回答
1

每当我想做这样的事情时,我发现通常最好重构您的设计以使用命令模式,特别是因为您的所有方法都具有相同的参数。这种方式允许更大的灵活性。

于 2008-09-25T20:44:07.777 回答
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 回答