C#Delegate——如何先将一个委托与多个具有不同参数的函数绑定(相同类型),然后再触发/调用它们?

C#Delegate——如何先将一个委托与多个具有不同参数的函数绑定(相同类型),然后再触发/调用它们?,c#,delegates,multicastdelegate,C#,Delegates,Multicastdelegate,我需要一个C#委托,首先绑定多个具有不同参数的函数(同一类型),然后再触发/调用它们 请参见下面的示例: (请注意,我的实际需求要复杂得多,但同样的原则也适用——我不想用业务/域/实现/无聊的部分来打扰您)。 (另外,如果语法不正确,请原谅:P) 假设我有以下4个函数,具有相同类型和数量的参数: Void Add(int , int) Void Subtract(int , int) Void Multiply(int, int) Void Divide(int , int) 我知道,因为它们

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

请参见下面的示例:

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

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

Void Add(int , int)
Void Subtract(int , int)
Void Multiply(int, int)
Void Divide(int , int)
我知道,因为它们有相同的参数,我可以有一个委托指向所有的,对吗

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

例如

delegate void MyDelegate (int a , int b);
然后使用委托,类似这样:-

MyDelegate del;


del = Add;

del += Subtract;
del += Multiply;
以后,我可以这样使用它:

del(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
//
现在,这将激发具有相同参数10和20的所有函数

我的要求是有一个多播委托,在这里我可以添加我想要的所有函数,但有不同的参数

当我指定参数时,不应该激发/调用它们,相反,应该在以后调用/激发它们,而是按照我链接/链接它们的顺序一起调用/激发它们

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

del(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();     

我记得我读过类似的东西,但今天在谷歌上找不到任何东西。任何帮助都将不胜感激。

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

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

我能想到的最简单的解决方案是使用lambda表达式创建闭包,将具有任意参数值的委托“转换”为无参数操作委托。添加任意数量的代理,然后按如下方式立即调用它们:

    //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();

不清楚。除了Invoke()之外,您的第二个示例是相同的(即所有
void F(int,int)
)。“延迟”功能是隐含的,“可变参数”是不可能的。在C#中,代理不是这样工作的,看起来你有一把锤子,一切看起来都像钉子。您应该阅读有关命令模式的内容。也许您正在寻找?这将对您有所帮助@mswietlicki:抱歉,但我认为我无法在这里使用命令模式。也许你可以建议,我如何使用它?谢谢,这似乎是我想做的,但我不能正确使用动作关键字,它不断抛出错误。我是不是漏掉了一封推荐信或其他什么?现在只需要让它工作起来。。。感谢您的帮助并投票通过。操作委托在系统命名空间的mscorlib.dll中声明,因此您应该已经在项目中有了必要的引用。它是.NETFramework4.0中的一个新类,所以您的目标可能是较旧的框架?无论如何,你可以自己声明它为“public delegate void Action();”很抱歉这么晚才回复,这似乎对我有用,是的,我只需要添加mscorlib,在将它插入项目之前,我在一个小型控制台应用程序上进行了测试,所以没有引用。