3 回答
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);
}
}
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)从该类中的任何位置或继承层次结构下的任何位置调用以调用事件。
- 3 回答
- 0 关注
- 457 浏览
添加回答
举报