2013-08-25 30 views
1

假設我有2個類,classA和classB。對象A(classA)包含一些對象B(classB)。 B對象有一個事件,並且對象A已經訂閱了一個委託,該委託在引發(任何這些B對象的事件)時被執行。在訂閱另一個對象的事件的委託中使用(object sender)

private void fooEventHandler(object sender, EventArgs e) 
{ 
... 
} 

在做fooEventHandler東西(這必須在內部完成)後,我想給的信號已經引發該事件的我在fooEventHandler所做的結果B對象。所以我做了以下幾點:

private void fooEventHandler(object sender, EventArgs e) 
    { 
    ... 

     if (allOK) 
      ((classB)sender).isOK(); 
     else 
      ((classB) sender).isNotOK(); 
    } 

所以我實際上使用發件人在事件上升後調用objectB上的特定方法。我正在做這一切,以避免傳遞給objectB(在他的構造函數中)一些objectA成員,從設計的角度來看不應該在objectB中。這是處理這個問題的合理方式嗎?以這種方式使用(對象發送者)是否很常見?

+2

isNotOK()。以一個例子來看看CancelEventHandler委託。 –

+0

嗯..你可能會更具體一點嗎?我正在查看CancelEventHandler,但我不明白你的意思...... –

+0

如果這是你的事件,最好定義一個處理程序,它具有classB作爲參數而不是對象 – Vadim

回答

1

這是一個解決方案,但我認爲不是更好的方式。

下面是另一種解決辦法

步驟1: - 創建繼承類的EventArgs的,並添加在其上定義的治療中的B類

做對於樣品的一些性質:

public class ClassBEventArgs : EventArgs 
{ 
    bool treatmentIsOK = false; 
} 

步驟2: 在B類的相同名稱空間中創建一個新的委託事件定義並用它來聲明事件

對於樣品:

namespace ClassBNameSpace 
{ 
    public delagate fooEventHandlerDelegate void (object sender, ClassBEventArgs e); 

    public ClassB 
    { 

    public event fooEventHandlerDelegate fooEventHandler; 

    ......... 

步驟3: 在ClassB的提高fooEventHandler事件與ClassBEventArgs對象。 在ClassA事件處理程序中,設置了正確的值爲treatmentIsOK的EventArgs。當從ClassA的事件回調ClassB的,你可以利用treatmentIsOK propertie

的採樣值:

....... 
if (this.fooEventHandler != null) 
{ 
    ClassBEventArgs customEventArgs = new ClassBEventArgs(); 
    this.fooEventHandler (this,customEventArgs); 
    if (customEventArgs.treatmentIsOK) 
    { 
     this.isOK(); ==> Your code 
    } 
    else 
    { 
     this.isOK(); ==> Your code 
    } 
} 
....... 
+0

這是@Hans在問題的第一評論中所說的。它可以用'CancelEventArgs'輕鬆完成是不是?爲什麼不使用'CancelEventArgs' –

+0

當然!!你可以使用它。我的解決方案提供了更好地自定義EventArgs的可能性。 – tdelepine

+0

雖然你的解決方案是正確的。爲什麼要重新發明輪子? –

1

爲什麼不創建自己的EventArgs類並把B放在那裏?

像:

public class ClassBEventArgs : EventArgs 
{ 
    public classB classBObject { get; set; } 
} 
2

我想你讓你的類太加上你的B級。如果處理事件後需要A做的是調用某個回調 - 然後傳遞迴調。這樣,你可以傳遞lambda表達式,或者傳遞與B相關的類的方法或其他。

所以 -

private void fooEventHandler(Action p_okCallback, Action p_notOkCallback) 
{ 
    ... 

    if (allOK) 
     p_okCallback(); 
    else 
     p_notOkCallback(); 
} 

或 -

private void fooEventHandler(Action<bool> p_callback) 
{  
    ... 

    p_callback(allOk); 
} 

如果該事件是不是你的控制之下,你可以不喜歡從EventArgs的建議通過赫爾默和繼承。但再次 - 我會傳遞迴調,而不是類本身。

另一種選擇 - 如果您覺得您需要多種方法,並且感到尷尬,那麼需要傳遞十幾個回調 - 考慮傳遞一個完全符合您需要的方法的接口。