关于c#:从”委托调用”列表中获取结果

Get result from Delegate Invocation list

我有一个非常简单的问题。我对C#中的委托和Lambda表达式了解甚少。我有代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Program
{
    delegate int del(int i);
    static void Main(string[] args)
    {
        del myDelegate = Multiply;
        int j;

        myDelegate = x => { Console.WriteLine("Lambda Expression Called..."); return x * x; };            
        myDelegate += Multiply;
        myDelegate += Increment;

        j = myDelegate(6);

        Console.WriteLine(j);
        Console.ReadKey();
    }

    public static int Multiply(int num)
    {
        Console.WriteLine("Multiply Called...");
        return num * num;
    }
    public static int Increment(int num)
    {
        Console.WriteLine("Increment Called...");
        return num += 1;
    }
}

结果是:

1
2
3
4
Lambda Expression Called...
Multiply Called...
Increment Called...
7

它显示了从调用列表中调用的最后一个方法的结果7

如何从委托调用列表中获取每种方法的结果?我看过这个主题,但是我不明白这个主意。如果您可以通过上面提供的代码提供答案,我们将不胜感激。

谢谢!


将.NET委托的多播功能用于事件订阅者之外的其他事情(考虑使用简单的集合)是非常不寻常的。

也就是说,可以获取组成多播委托的各个委托(使用Delegate.GetInvocationList)并依次调用它们中的每一个,而不是让框架为您做这件事(通过直接调用多播委托)。这样,可以检查调用列表中每个成员的返回值。

1
2
3
4
5
foreach(del unicastDelegate in myDelegate.GetInvocationList())
{
    int j = unicastDelegate(6);
    Console.WriteLine(j);
}

输出:

1
2
3
4
5
6
Lambda Expression Called...
36
Multiply Called...
36
Increment Called...
7