[英]How to get results list of delegate's invocation?
假設我有一個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>
,則可以完成所需的操作,但可以使用方法作為處理返回值的參數。 這是一個小例子:
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)從委托返回值,只能通過嗅探到結果列表。 另一種方法是擁有代表列表並手動管理它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.