簡體   English   中英

如何獲取委托調用的結果列表?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM