猿问

C#:引发继承的事件

我有一个包含以下事件的基类:


public event EventHandler Loading;

public event EventHandler Finished;

在从该基类继承的类中,我尝试引发该事件:


this.Loading(this, new EventHandler()); // All we care about is which object is loading.

我收到以下错误:


事件“ BaseClass.Loading”只能出现在+ =或-=(BaseClass')的左侧


我假设我无法像其他继承成员一样访问这些事件?


12345678_0001
浏览 458回答 3
3回答

Cats萌萌

您要做的是:在基类(已声明事件的位置)中,创建可用于引发事件的受保护方法:public class MyClass{   public event EventHandler Loading;   public event EventHandler Finished;   protected virtual void OnLoading(EventArgs e)   {       EventHandler handler = Loading;       if( handler != null )       {           handler(this, e);       }   }   protected virtual void OnFinished(EventArgs e)   {       EventHandler handler = Finished;       if( handler != null )       {           handler(this, e);       }   }}(请注意,您可能应该更改这些方法,以检查是否必须调用事件处理程序)。然后,在从该基类继承的类中,您只需调用OnFinished或OnLoading方法来引发事件:public AnotherClass : MyClass{    public void DoSomeStuff()    {        ...        OnLoading(EventArgs.Empty);        ...        OnFinished(EventArgs.Empty);    }}

芜湖不芜

您只能访问声明类中的事件,因为.NET在实际持有委托的幕后创建了私有实例变量。这样做public event EventHandler MyPropertyChanged;实际上正在这样做;private EventHandler myPropertyChangedDelegate;public event EventHandler MyPropertyChanged{    add { myPropertyChangedDelegate += value; }    remove { myPropertyChangedDelegate -= value; }}并这样做...MyPropertyChanged(this, EventArgs.Empty);其实就是这个myPropertyChangedDelegate(this, EventArgs.Empty);因此,您(显然)只能从声明类中访问私有委托实例变量。约定是在声明类中提供类似的内容。protected virtual void OnMyPropertyChanged(EventArgs e){    EventHandler invoker = MyPropertyChanged;    if(invoker != null) invoker(this, e);}然后,您可以OnMyPropertyChanged(EventArgs.Empty)从该类中的任何位置或继承层次结构下的任何位置调用以调用事件。
随时随地看视频慕课网APP
我要回答