2012-12-21 42 views
-1

我試圖將委託指派給屬於另一個類對象的方法。將代理指向類中的方法

TestingClass testObj = new TestingClass(); 
Delegate myDelegate = testObj.testMethod; //syntax error 

我的目的是在testObj指向myDelegate該方法testMethod。上面的代碼有語法錯誤。

什麼是正確的語法在C#中做到這一點?

+0

有什麼語法錯誤? testMethod的簽名是什麼? – jpmc26

+0

http://www.akadia.com/services/dotnet_delegates_and_events.html – MethodMan

+0

@ jpmc26 IDE僅強調第二行爲語法錯誤,不允許編譯。 – Carven

回答

1

如果你使用真正的委託意向 - 這可以很方便的創建一個良好的命名類型 - 定義自己的一個:

class Program 
{ 
    delegate void D1(); 

    static void Main(string[] args) 
    { 
     var testObj = new Program(); 
     D1 myDelegate = testObj.TestMethod; 
     myDelegate.Invoke(); 
    } 

    void TestMethod() 
    { 
     Console.WriteLine("Foo!"); 
    } 
} 
+1

實際上從來沒有需要定義自己的代表。你可以,也應該儘可能使用'Action'或'Func'(幾乎所有的時間)。它更快,更容易,更具可讀性。 – Servy

0

看看如何使用喬恩長柄水杓教程,以及建立代表它是直接和簡單易懂Delegates and Events

下面是一個簡單的例子,說明你如何使用它基於我寫了一個例子你

//Define a delegate here in your Class 
public delegate void MyMessageHandler(string message); 

然後,您可以使用它像這樣:

public void DoWork(MyMessageHandler callback) 
{ 
    string message = ""; 
    .... 
    callback(message); 
} 

你再這樣稱呼它:

public Main() 
{ 
    DoWork(ProcessMessages); 
} 
public void ProcessMessages(string message) 
{ 
    .... 
} 
+0

實際上從來沒有需要定義您自己的代表。你可以,也應該儘可能使用'Action'或'Func'(幾乎所有的時間)。它更快,更容易,更具可讀性。 – Servy

+0

我理解Servy,但我提供了一個基於OP現有代碼的示例 – MethodMan

+0

並基於OP的現有代碼,他爲什麼需要定義他自己的代表而不是使用'Action '? – Servy

3

您應該將它分配給具有兼容委託類型的變量,例如,

Action myDelegate = testObj.testMethod; 

委託類型取決於testMethod的定義。

+0

.NET [4.5]中有多達16個參數的[Action委託](http://msdn.microsoft.com/en-us/library/vstudio/system.action.aspx)定義。你會像這樣使用它們:Action 如果testMethod需要2個字符串參數。此外,還有[Func委託](http://msdn.microsoft.com/en-us/library/bb534960.aspx),它具有返回值方法的多種變體。 – jpmc26

相關問題