2011-01-24 82 views
2

我知道我可以委託我的事件的訂閱到另一個事件,我可以委託一個事件並能夠調用它嗎?

public event EventHandler MyEvent 
{ 
    add { SomeClass.AnotherEvent += value; } 
    remove { SomeClass.AnotherEvent -= value; } 
} 

在這種情況下,如果AnotherEvent擡起,然後MyEvent也將被提高。

但是在我的課,我不能在我自己照常升起MyEvent(),因爲它說: Error 3 The event 'MyEvent' can only appear on the left hand side of += or -=

我想這是因爲上述認購代表團。

我可以委託訂閱以及自行調用訂閱嗎?目標是讓MyEvent可以通過兩個東西AnotherEvent以及我自己的代碼來引發。

+0

你試着用哪個代碼來提高「MyEvent」? – TToni

+0

只是我的方法中的一些代碼,像'MyEvent(this);' –

回答

4

是的,你可以 - 但你需要你自己的委託變量。你既可以訂閱SomeClass.AnotherEvent一次,當事件引發調用自己的委託,或者只是保持訂戶兩次:

private EventHandler myEvent; 

public event EventHandler MyEvent 
{ 
    add 
    { 
     myEvent += value; 
     SomeClass.AnotherEvent += value; 
    } 
    remove 
    { 
     myEvent -= value; 
     SomeClass.AnotherEvent -= value; 
    } 
} 

請注意,如果你去了「訂閱SomeClass.AnotherEvent一次」的方式,你可能想要考慮只有訂閱當您第一次看到訂閱MyEvent,並取消訂閱myEvent在取消訂閱後變爲null。它可以在處置方面都相當棘手......

+0

通過「訂閱SomeClass.AnotherEvent一次」你的意思是皮特的和阿卡什的答案? –

+0

@Louis:和阿卡什的,是的。 –

+0

好的謝謝。我也想到了他們的解決方案,我想像它會像你說的那樣棘手。我的解決方案沒有出現,我認爲它好多了。謝謝! –

1

你必須要連接你的其他SomeClass的的事件..

// constructor or initializer.. 

SomeClass.AnotherEvent += (s,e)=>{ 
    if(MyEvent != null){ 
     MyEvent(s,e); 
    } 
}; 

// let this be implicit default event 
public event EventHandler MyEvent; 

protected void RaiseMyEvent(){ 
    if(MyEvent != null){ 
     MyEvent(this,EventArgs.Empty); 
    } 
} 
0

您需要調用委託本身,而不是事件屬性。由於MyEvent沒有後臺字段,這意味着您必須調用SomeClass.AnotherEvent的後臺字段,該字段(通常)只能用SomeClass。正如其他人所說,有這方面的解決方法。看到他們的答案。

0

我不認爲你可以,如果可以的話,我不認爲這是合乎邏輯的。所以我會正常實現這個事件,然後向你的類添加一個事件處理程序來監聽來自其他類的事件。

你基本上正在創建一個類,當事件在類內部發生時發生,並且在依賴類中發生了某些事件。我認爲實施應該反映這一點。例如:

public MyClass() 
{ 
    this.other = new SomeClass; 
    other.AnotherEvent += SomeClass_AnotherEvent; 
} 
public event EventHandler MyEvent; 
private void SomeClass_AnotherEvent(object sender, EventArgs e) 
{ 
    if (MyEvent != null) 
     MyEvent(this, e); // I think that it would be most logical, that you do not pass the sender 
} 
相關問題