比方说,我有一个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 不是通用的,而委托是通用的)?
不,没有更好的方法 - 当您调用多播委托时,结果只是最终委托的结果。这就是框架级别的情况。
组播代表是mostly对于事件处理程序很有用。将它们用于此类功能的情况相对较少。
注意Delegate
本身也不是通用的 - 只是个人委托类型可以是泛型的,因为类型的数量可以根据类型而改变。 (例如。Action<T>
and Action<T1, T2>
实际上是不相关的类型。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)