2014-01-27 91 views
0

我想了解下面的代码实际上做了什么。Func委托用作参数

我们有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

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

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

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

+0

为什么有人想从一个方法创建委托?对于我来说,代表就像某些方法遵循的模式。它在这里如何工作? –

+1

代表是某种方式的“模式”,但它们与该语言中的任何其他类型一样。从一个方法创建一个委托的事情是很常见的,而且在lamda表达式之前或多或少是唯一的方法。在某些情况下,您可以只使用方法作为参数,但我不确定这是适用于您的情况,我需要查看更多的代码。 –

+0

好的......所以我们可以说这种方法让我们说ABC从现在开始是一个代表?我不明白... –