【问题标题】:How to get results list of delegate's invocation?如何获取委托调用的结果列表?
【发布时间】:2011-06-20 12:53:28
【问题描述】:

假设我有一个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 不是通用的,而代表是)?

【问题讨论】:

  • '真的,为什么 MulticastDelegate 在委托时不是泛型' MulticastDelegate 从 1.1 开始就在框架中,这意味着在编码时没有任何泛型可用。

标签: c# .net generics delegates


【解决方案1】:

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

多播委托大部分对事件处理程序很有用。将它们用于这样的功能相对较少。

请注意,Delegate 本身也不是通用的 - 只有 individual 委托类型可以是通用的,因为类型的数量可以根据类型而改变。 (例如,Action&lt;T&gt;Action&lt;T1, T2&gt; 确实是不相关的类型。)

【讨论】:

  • MulticastDelegate 是抽象的,所以我是否正确理解像 Action “内部某处”这样的具体委托会产生继承类(MulticastDelegate 的子级)?那为什么不能添加新方法 GetTypedInvocations 返回的不是 Delegate[] 而是 Action[] ?
  • @Roman:是的,每种特定类型都可以添加自己的那种方法——尽管它需要创建相关的数组等。
【解决方案2】:

如果您不使用Func&lt;int&gt;,而是使用将方法作为参数处理返回值的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);

    }

【讨论】:

  • 我现在用 Listof 代表得到了我想要的东西(用“GetInvocations”转义所有东西),但是你的示例给了我更多的想法。谢谢你。很好的思维方式。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    相关资源
    最近更新 更多