如何获取代表的结果列表';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不是通用的,而委托是通用的)?
不,没有更好的方法了——当您调用多播委托时,结果只是最终委托的结果。这就是框架级别的情况。
多播委托对事件处理程序非常有用。将它们用于此类功能的情况相对较少。
请注意,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)返回值,只能通过探查结果列表。另一种方法是拥有委托列表并手动管理它。