为了账号安全,请及时绑定邮箱和手机立即绑定

C#:引发继承的事件

C#:引发继承的事件

C#
12345678_0001 2019-11-27 10:24:16
我有一个包含以下事件的基类: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')的左侧我假设我无法像其他继承成员一样访问这些事件?
查看完整描述

3 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

您要做的是:


在基类(已声明事件的位置)中,创建可用于引发事件的受保护方法:


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);

    }

}


查看完整回答
反对 回复 2019-11-27
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

您只能访问声明类中的事件,因为.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)从该类中的任何位置或继承层次结构下的任何位置调用以调用事件。


查看完整回答
反对 回复 2019-11-27
  • 3 回答
  • 0 关注
  • 457 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信