使用具有返回值的多个函数调用委托

时间:2015-05-02 06:12:00

标签: c# delegates

我正在尝试理解委托的概念并且有一个查询。假设我们将一个委托定义为返回类型为int并接受类型为int的两个参数。

代表声明:

 public delegate int BinaryOp(int x, int y); 

现在,假设我们有2个方法(加法和乘法)都接受2个int参数并返回int结果。

代码:

    static int Add(int x, int y)  
   {     
        return x + y; 
    }  

    static int Multiply(int x, int y)  
   {     
        return x * y; 
    }  

现在,当add和multiply方法被添加到此委托中时,然后当委托被调用时:

BinaryOp b = new BinaryOp(Add);
b+=new BinaryOp(Multiply);

int value=delegate_name(2,3);

然后,根据我的理解,这两种方法都被调用了。现在,两个方法中的哪一个存储在值变量中?或者它在这种情况下返回一个数组?

3 个答案:

答案 0 :(得分:5)

实际上,通过一些技巧和演员,您可以得到所有结果:

var b = new BinaryOp(Add);
b += new BinaryOp(Multiply);

var results = b.GetInvocationList().Select(x => (int)x.DynamicInvoke(2, 3));
foreach (var result in results)
    Console.WriteLine(result);

输出:

5
6

答案 1 :(得分:4)

您将获得添加到多播委托的最后一个方法的返回值。在这种情况下,您将获得UIView的返回值。

有关详情,请参阅文档:https://msdn.microsoft.com/en-us/library/ms173172.aspx

答案 2 :(得分:1)

是的,调用多播委托会调用所有已订阅的方法,但不会返回结果数组 - 只返回result returned by the last subscriber

要获取所有订阅者的返回结果,您可以做的是构建一个类型为Func的集合,然后您可以调用并整理结果:

 IEnumerable<int> InvokeResults(IEnumerable<Func<int, int, int>> operations, 
                                int x, int y)
 {
     return operations.Select(op => op(x, y));
 }

并调用如下:

 var results = InvokeResults(new Func<int, int, int>[] {Add, Multiply}, 2, 3);