2014-01-27 95 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從現在開始是一個代表?我不明白... –