C # : 引发继承事件

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

public event EventHandler Loading;
public event EventHandler Finished;

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

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

我收到以下错误:

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

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

70002 次浏览

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

没错。通常为基类中的每个事件提供受保护的函数 OnXyzRaiseXyz,以便能够从继承类引发。例如:

public event EventHandler Loading;


protected virtual void OnLoading() {
EventHandler handler = Loading;
if (handler != null)
handler(this, EventArgs.Empty);
}

在继承类中调用:

OnLoading();

你要做的是:

在基类中(在其中声明了事件) ,创建可用于引发事件的 protected 方法:

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

(注意,您可能应该更改这些方法,以检查是否必须调用 eventhandler)。

然后,在从这个基类继承的类中,只需调用 OnFinish 或 OnLoad 方法来引发事件:

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)来调用事件。

你可以试试这样,对我很有效:

public delegate void MyEventHaldler(object sender, EventArgs e);


public class B
{
public virtual event MyEventHaldler MyEvent;
protected override void OnChanged(EventArgs e)
{
if (MyEvent != null)
MyEvent(this, e);
}
}


public class D : B
{
public override event MyEventHaldler MyEvent;
protected override void OnChanged(EventArgs e)
{
if (MyEvent != null)
MyEvent(this, e);
}
}

我不是要重提旧事,但是如果有人注意到了,我所做的是

protected EventHandler myPropertyChangedDelegate;


public event EventHandler MyPropertyChanged
{
add { myPropertyChangedDelegate += value; }
remove { myPropertyChangedDelegate -= value; }
}

这使您可以继承派生类中的事件,因此您可以调用它,而无需在保持 + = 语法的同时包装该方法。我想如果您这样做了,您仍然可以使用包装方法来做到这一点

public event EventHandler MyPropertyChanged
{
add { AddDelegate(value); }
remove { RemoveDelegate(value); }
}