繁体   English   中英

我可以使用列表吗? <T> 作为方法指针的集合? (C#)

[英]Can I use a List<T> as a collection of method pointers? (C#)

我想创建一个要执行的方法列表。 每种方法都具有相同的签名。 我想过将委托放在一个通用集合中,但我一直收到这个错误:

'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转换为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的,我认为它会起作用。

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

让它们全部实现通用接口,比如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;
    }
}

没有尝试过,但使用List <Action <t >>类型应该可以做到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM