2010-04-01 110 views
1

事件只能返回void並接收對象sender/eventargs嗎?事件處理C#/註冊回調

如果是這樣那麼craptastic ....我怎麼能傳遞一個函數指針到另一個OBJ,如:

public bool ACallBackFunc(int n) 
{ 
    return n > 0; 
} 

public void RegisterCallback(Something s) 
{ 
    s.GiveCallBack(this.ACallBackFunc); 
} 

Something::GiveCallBack(Action? funcPtr) 

我試着用Action,但我需要它返回一定的價值和Action唯一能返回void。另外,我們不知道我們會收到什麼樣的回調;它可以返回任何東西,並有任何參數!反思將不得不以某種方式使用我認爲。

回答

0

我寫過返回值的事件,通常是bool。但是,使用Func將允許返回值。

+0

一個例子可以闡明你的意思。 – 2010-04-01 04:39:20

+0

Func <>看起來我需要提前知道返回類型......我們可能會註冊一個未知類型的函數返回值。 – 2010-04-01 04:41:50

+0

嘗試'Func '。它可以獲取任意類型的任意數量的參數(通過對象數組,例如當使用'params'關鍵字時)並返回任何類型的參數。 – 2010-04-26 09:04:54

0

你需要創建一個傳回的類委託你感興趣

公衆委託無效CallbackDelegate(東西或多個); 公共事件CallbackDelegate myCallBack函數

公共無效myFunction的(){ 如果 (!myCallBack函數= NULL) myCallBack函數(新的東西()); }

退房MSDN教程... http://msdn.microsoft.com/en-us/library/aa645739(VS.71).aspx

0

行動的定義沒有返回值,你可以使用通用的版本,它允許多個參數。

如果你想它的返回值,使用Func鍵或者如果你只是想它返回布爾和一個參數,你可以使用謂詞

或者你可以無論如何定義委託你想返回void或價值和採取任何數量的論點。你可以像下面那樣定義一個委託,它就像你可以使用的一個類型。然後,您可以直接將其作爲回調參數傳遞,而無需使用Action,Func或Predicate。自定義委託也常用於編寫自定義多播事件處理程序。

public delegate double PerformAverageEventHandler(int val1, int val2, int val3); 
0

也許你沒有意識到一個事件是一個允許多個事件監聽器的多播委託。這會讓您(潛在地)需要接收多個返回值。

解決此問題的一些想法是將引用對象傳遞給保持對該對象的引用的事件處理程序。你可能會得到結果,但你需要另一個事件來知道對象何時被改變。但重新思考你想要完​​成的任何事情可能是一個更好的主意。這聽起來像是一個堆棧溢出的祕訣,當你最終陷入事件的無限循環中時,會導致事件的改變。

相關問題