如何获取代表的结果列表';s调用

本文关键字:调用 列表 结果 何获 取代 | 更新日期: 2023-09-27 17:59:31

比方说,我有一个MulticastDelegate,它实现了泛型委托,并包含几个调用:

Func<int> func = null;
func += ( )=> return 8;
func += () => return 16;
func += () => return 32;

现在这个代码将返回32:

int x = func(); // x=32

我想知道是否存在(或者更好的是,我应该问为什么不存在!)C#语言功能,使用它可以访问所有委托调用的结果,也就是说获得列表({8,16,32})?

当然,使用.NET框架例程也可以做到这一点。像这样的东西会起作用:

public static List<TOut> InvokeToList<TOut>(this Func<TOut> func)
{
    var returnValue = new List<TOut>();
    if (func != null)
    {
        var invocations = func.GetInvocationList();
        returnValue.AddRange(invocations.Select(@delegate => ((Func<TOut>) @delegate)()));
    }
    return returnValue;
}

但我无法从系统中得出结论,应该有更好的方法,至少不需要铸造(真的,为什么MulticastDelegate不是通用的,而委托是通用的)?

如何获取代表的结果列表';s调用

不,没有更好的方法了——当您调用多播委托时,结果只是最终委托的结果。这就是框架级别的情况。

多播委托对事件处理程序非常有用。将它们用于此类功能的情况相对较少。

请注意,Delegate本身也不是泛型的——只有单个委托类型可以是泛型的,因为类型的arity可以根据类型而更改。(例如Action<T>Action<T1, T2>实际上是不相关的类型。)

如果不使用Func<int>,而是使用Action,该Action将一个方法作为处理返回值的参数,则可以实现您想要的功能。这里有一个小例子:

    static Action<Action<int>> OnMyEvent=null;
    static void Main(string[] args)
    {
        OnMyEvent += processResult => processResult(8);
        OnMyEvent += processResult => processResult(16);
        OnMyEvent += processResult => processResult(32);
        var results = new List<int>();
        OnMyEvent(val => results.Add(val));
        foreach (var v in results)
            Console.WriteLine(v);
    }

无法从委托中获取a)异常b)返回值,只能通过探查结果列表。另一种方法是拥有委托列表并手动管理它。