2012-12-07 58 views
2

任何避免在這種情況下明確聲明MyMethodDelegate的方法?C# - 方法的自動委託類型

bool MyMethod(string x) 
{ 
    //... 
} 

BeginInvoke(new MyMethodDelegate(MyMethod), x); 

我知道lambda表達式一拉()=>MyMethod(x),但是我想,以避免它們有時他們打破編輯和繼續。

編輯:只是BeginInvoke(MyMethod, x)不起作用:

The best overloaded method match for 'System.Windows.Forms.Control.BeginInvoke(System.Delegate, params object[])' has some invalid arguments 
Argument 1: cannot convert from 'method group' to 'System.Delegate' 
Argument 2: cannot convert from 'string' to 'object[]' 

BeginInvoke的定義如下:

public IAsyncResult BeginInvoke(Delegate method, params object[] args); 

它不指定任何特定的委託類型,所以編譯器無法檢測其委託類型來實例化BeginInvoke(MyMethod. x)

回答

3

對於框架> = 3.5,你可以使用預定義的代表行動<>和Func鍵<>(你的情況)

BeginInvoke(new Func<int, bool>(MyMethod), x); 

文檔的Func鍵 http://msdn.microsoft.com/ru-ru/library/bb549151.aspx

+0

打我吧。儘管按照OP,'int'應該是一個'string'。 –

3

您可以經常使用簡化ied版本

MyMethod 

當需要委託時。關鍵字是經常是

但是,如果編譯器無法確定代表對方法組轉換的哪個類型,你將不得不幫助用明確的轉換

lambda表達式可以派上用場,當你要傳遞一個函數,你尚未在代碼中的其他位置定義和需要。然後,Lambdas(以及一般的匿名函數)將非常方便,因爲您可以在需要的地方簡單定義函數。

你是正確的,因爲在你不能,你需要通過鑄造或分配方法組顯式轉換爲代表的評論中所指出的BeginInvoke的情況下

Func<int,bool) m = MyMethod; 
BeginInvoke(m,x); 
BeginInvoke((Func<inte,bool>)MyMethod,x); 

將編譯或你可以在一個lambda傳遞,因爲這是解釋爲Func鍵

BeginInvoke(a=>MyMethod(a),x); 
+0

不工作,爲的BeginInvoke()需要一個通用的委託。更新後。 –

+0

@IvanShcherbakov你寫過你不能將MyMethod作爲一個委託來傳遞__no__參數,因爲MyMethod接受了這個參數。自從我寫了「BeginInvoke」之後很長一段時間,但是如果你真的傳遞了一個參數,它可能會工作。 –

+0

爲了簡單起見,我已經把它留在這裏了。我明顯已經通過了實際的代碼。 –