2013-07-02 56 views
2

我已經在Alice類的事件,我想一個派生類Bob內提高:C# - 調用事件之外聲明

public class Alice 
{ 
    public event Action<object> ValueChanged; 
} 

public class Bob : Alice 
{ 
    public void method1(Alice bigAlice) 
    { 
     // raise ValueChanged event 
     // or 
     // raise ValueChanged event on bigAlice 
    } 
} 

編譯錯誤說,我只能使用+=-=如果我m不在事件的聲明類中。儘管如此,我怎麼能從鮑勃的代碼中解僱這件事呢?

回答

4

您可能使受保護的方法來調用它:

public class Alice { 
    public event Action<object> ValueChanged; 

    protected void RaiseValueChanged(object o) { 
    if (ValueChanged != null) { 
     ValueChanged(o); 
    } 
    } 
} 
+1

爭用條件:http://broadcast.oreilly.com/2010/09/understanding-c-raising-events.html – spender

+1

ValueChanged的調用列表可能會在空檢查之後但在事件調用之前發生更改(可能導致nullref異常)。取一份副本並改爲使用它。無論如何,國際海事組織的線索和事件使得相當不滿意的合作伙伴,但採取副本是慣用的。 – spender

8

事件不能在聲明類以外的其他地方引發。

在您的基類中創建一個受保護的方法,該方法引發該事件並從您的子類中調用它。

+0

的建議因爲我仍然Java的在我的腦海我剛剛注意到,我不能把一個受保護的方法異物上,雖然它是從班'愛麗絲'。有一些幫助嗎? – Bitterblue

+0

@ mini-me:您可以從Alice的_subclass_(例如您發佈的Bob類)調用受保護的方法。如果你想讓不是'Alice'的子類的_other_類來觸發事件,那麼你需要使觸發事件爲'public'。 –

3

你可以像這樣做,使觸發該事件的受保護方法,並從鮑勃方法調用它。 編輯:刪除與可能的競爭條件的問題,通過@spender

public class Alice 
    { 
     public event Action<object> ValueChanged; 
     protected void OnValueChanged(object arg) 
     { 
      Action<object> temp = ValueChanged; 
      if (temp != null) 
      { 
       temp (arg); 
      } 
     } 
    } 

    public class Bob : Alice 
    { 
     public void method1() 
     { 
      object o = null; 
      OnValueChanged(o); 
     } 
    }