Func委托用作参数

时间:2014-01-27 11:21:05

标签: c# delegates

我想了解下面的代码实际上是做什么的。

我们有Submit方法返回void并且有两个参数:

  • 委托d
  • 任何参数的数量不受限制

然后我们用参数调用Submit方法。

这部分代码我不明白。

void Submit(Delegate d, params object[] arguments)
{
    ServiceQueue.Get.Submit(d, arguments);
}

Submit(new Func<BusinessMetadataQueryDataContract,
            AsyncCallback,
            object,
            IAsyncResult>(
                this.Channel.BeginBusinessMetadataGet),
                contract,
                new AsyncCallback(
                    (iar) =>
                    {
                        BusinessMetadataDataContract outContract = null;
                        Action<Exception, OpusReturnType> response =
                            (e, ort) =>
                            {
                                SilverlightClient.UIThread.Run(() =>
                                {
                                    this.BusinessMetadataGetActionCompleted(this,
                                        new ActionCompletedEventArgs<BusinessMetadataDataContract>(
                                            ort,
                                            outContract,
                                            e,
                                            false,
                                            asyncState));
                                });
                            };

                        try
                        {
                            response(null,
                                this.Channel.EndBusinessMetadataGet(
                                    out outContract,
                                    iar));
                        }
                        catch (Exception e)
                        {
                            response(e,
                                new OpusReturnType());
                        }
                    }),
                asyncState);

Func方法接受三个参数并返回值。

所以我们有类型的参数:

  • BusinessMetadataQueryDataContract
  • 的AsyncCallback
  • 物体

我们有返回类型:

  • IAsyncResult的

然后我们有:(this.Channel.BeginBusinessMetadataGet),

我不明白。这是做什么的?我期待一个左括号(和第一个BusinessMetadataQueryDataContract类型的参数,而我得到(this.Channel.BeginBusinessMetadataGet),预期参数位于第二个位置。

我必须在这里遗漏一些东西。

有任何帮助吗?谢谢!

1 个答案:

答案 0 :(得分:1)

this.Channel.BeginBusinessMetadataGet是实际的委托,它具有您描述的签名。所以第一个参数(代表d)是这样的:

new Func<BusinessMetadataQueryDataContract,
            AsyncCallback,
            object,
            IAsyncResult>(
   this.Channel.BeginBusinessMetadataGet)

这将从方法BeginBusinessMetadataGet创建一个委托。在此之后是代表将使用的所有参数。