C# Delegate -- 如何首先绑定具有不同参数(相同类型)的多个函数的委托,然后再绑定 Fire/Invoke 它们?
C# Delegate -- How to Bind a Delegate with multiple functions with different parameters first (same type) and then Fire/Invoke them later?
我需要一个 C# Delegate 来绑定多个具有不同参数的函数(相同类型),然后 Fire/Invoke 之后再绑定它们。
请看我下面的例子:
(请注意,我的实际要求要复杂得多,但适用相同的原则——不想用 business/domain/implementation/boring 位来打扰您)。
(此外,请原谅语法,如果它在某处不正确: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 的所有函数。
我的要求是有一个多播委托,我可以在其中添加我想要的所有函数,但它们有不同的参数。
当我指定参数时,它们不应该是 fired/invoked,相反,它们应该是 invoked/fired 之后,但总的来说,并且按照我 chained/linked 它们的顺序。
例如:我想做这样的事情:
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 表达式创建闭包,"converts" 将任意参数值委托给无参数 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();
我需要一个 C# Delegate 来绑定多个具有不同参数的函数(相同类型),然后 Fire/Invoke 之后再绑定它们。
请看我下面的例子:
(请注意,我的实际要求要复杂得多,但适用相同的原则——不想用 business/domain/implementation/boring 位来打扰您)。 (此外,请原谅语法,如果它在某处不正确: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 的所有函数。
我的要求是有一个多播委托,我可以在其中添加我想要的所有函数,但它们有不同的参数。
当我指定参数时,它们不应该是 fired/invoked,相反,它们应该是 invoked/fired 之后,但总的来说,并且按照我 chained/linked 它们的顺序。
例如:我想做这样的事情:
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 表达式创建闭包,"converts" 将任意参数值委托给无参数 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();