【问题标题】:How to make this extension method compile?如何使这个扩展方法编译?
【发布时间】:2009-05-15 17:20:53
【问题描述】:

我正在尝试为通用委托 Action<T> 创建一个扩展方法,以便能够对 Action<T> 方法进行简单的异步调用。它基本上只是实现了当你想要执行方法而不关心它的进度时的模式:

public static class ActionExtensions
{
    public static void AsyncInvoke<T>(this Action<T> action, T param) {
        action.BeginInvoke(param, AsyncActionCallback, action);
    }

    private static void AsyncActionCallback<T>(IAsyncResult asyncResult) {
        Action<T> action = (Action<T>)asyncResult.AsyncState;
        action.EndInvoke(asyncResult);
    }
}

问题在于它无法编译,因为额外的&lt;T&gt; 使AsyncActionCallback 通用并且具有与预期不同的签名。 签名void AsyncActionCallback(IAsyncResult) 是预期的。

有谁知道如何解决这个问题或完成我正在尝试做的事情?

【问题讨论】:

    标签: c# .net generics extension-methods


    【解决方案1】:
    public static void AsyncInvoke<T>(this Action<T> action, T param)
    {
        action.BeginInvoke(param, asyncResult => 
        {
            Action<T> a = (Action<T>)asyncResult.AsyncState;
            a.EndInvoke(asyncResult);
        }, action);
    }
    

    【讨论】:

    • 这是一种方式 :) 好主意。
    • 太棒了,非常感谢您如此快速的回答!有趣的是 lambdas 如何实现以前不可能的事情。我想这毕竟不仅仅是糖!
    • 请注意,这种方法可能会让调用期间发生的任何错误都被丢弃。您可能希望将 lambda 的内容包装在 try { } catch { } 中。
    【解决方案2】:

    AsyncActionCallback&lt;T&gt;?

    免责声明:不确定上述内容,可能是这些“限制”之一。

    【讨论】:

    • 我不确定你的意思。我在发布的代码中使用了完全相同的签名。但同样不会编译,因为编译器不期望类型参数 。无论如何,Darin 使用 lamda 而不是委托的解决方案有效。
    【解决方案3】:

    如果你想让你的函数保持分离(而不是 lambda),那么像这样的东西呢:

    public static void AsyncInvoke<T>(Action<T> action, T param)
    {
        action.BeginInvoke(param, new AsyncCallback(AsyncActionCallback<T>), action);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-16
      • 1970-01-01
      相关资源
      最近更新 更多