3

我需要一个 C# 委托来首先绑定具有不同参数(相同类型)的多个函数,然后稍后触发/调用它们。

请参阅下面的示例:

(请注意,我的实际需求要复杂得多,但同样的原则也适用——不想用业务/领域/实现/无聊的位来打扰您)。(另外,请原谅语法,如果它在某处不正确:P)

假设我有以下 4 个函数,具有相同的类型和数量的参数:

Void Add(int , int)
Void Subtract(int , int)
Void Multiply(int, int)
Void Divide(int , int)

我知道由于它们具有相同的参数,我可以让 1 个代表指向所有的,对吗?

而且我知道如果我使用多播委托,那么我可以使用它来触发全部或部分委托,对吗?

例如,

delegate void MyDelegate (int a , int b);

然后使用委托,如下所示:-

MyDelegate del;


del = Add;

del += Subtract;
del += Multiply;

后来,我可以这样使用它:

del(10,20);

现在,这将触发具有相同参数 10 和 20 的所有函数。

我的要求是有一个多演员委托,在那里我可以添加我想要的所有功能,但它们有不同的参数。

当我指定参数时,它们不应该被触发/调用,相反,它们应该稍后被调用/触发,但是完全按照我链接/链接它们的顺序。

例如:我想做这样的事情:

delayedDelegate = Add(1,2);
//
//Some Code Here
//
delayedDelegate += Subract(3,4)

//
//Some More Code Here
//

delayedDelegate += Multiply(5,6)

//
//More Code Here
//


delayedDelegate += Add(7,8);

//
// Just a little More Code Here
//

最后,开始执行:

// Fire all the chained functions with the parameters that werer assigned to them.
delayedDelegate.Invoke();     

我记得我读过这种东西,但今天通过谷歌搜索找不到任何东西。任何帮助将不胜感激。

4

2 回答 2

3

我能想到的最简单的解决方案是使用 lambda 表达式创建闭包,将具有任意参数值的委托“转换”为无参数的Action委托。添加任意数量的代表,然后像这样一次调用它们:

    //convert each delegate with parameters to Action
    Action delayedDelegate = () => Add(1, 2);
    delayedDelegate += () => Subtract(3, 4);
    delayedDelegate += () => Multiply(5, 6);

    //Later call all delegates at once
    delayedDelegate();
于 2015-07-27T10:27:02.803 回答
0

我不确定您是否正在寻找类似以下的内容:

public delegate int Test(int s, int j);

var o = new Test_ing();


var myDel = new Test(o.ADD);
myDel += o.Multiply;

var delegates = myDel.GetInvocationList();

var add_result = ((Test)delegates[0])(5, 6);    
var multiply_result = ((Test)delegates[1])(10, 2);

public class Test_ing
    {
        public int ADD(int i, int j)
        {
            return i + j;
        }

        public int Multiply(int i, int j)
        {
            return i * j;
        }
    }
于 2015-07-27T09:39:49.863 回答