Ken*_*nna 1 c# events properties
我需要使用不同类的属性来公开类实例的事件。
如果我公开一个在MyClass
同一个中定义的属性定义的事件MyClass
,以便该事件像支持字段一样工作,那么一切都很好:
private event EventHandler<EventArgs> _somethingHappened;
public EventHandler<EventArgs> SomethingHappened
{
get => _somethingHappened;
}
Run Code Online (Sandbox Code Playgroud)
听起来可能很奇怪,但出于某种原因它可能很有用。
但是,如果我公开(以相同的方式)在 中定义的事件AnotherClass
,并由该 的实例访问AnotherClass
,如下所示:
public EventHandler<EventArgs> SomethingStarted
{
get => Instance.Started;
}
Run Code Online (Sandbox Code Playgroud)
其中Instance
是它的实例AnotherClass
,Instance.Started
定义AnotherClass
如下:
public event EventHandler<EventArgs> Started;
Run Code Online (Sandbox Code Playgroud)
然后我收到错误:“该事件只能出现在左侧”。
我只是不明白为什么第一种情况是允许的,而第二种情况则不允许,尽管它们看起来非常相似。
事件没有 getter 或 setter,它们只有add
和remove
访问器,因此它们不能用作属性。
通过代码,get => Instance.Started
您试图获取值Instance.Started
,但没有吸气剂。
您可以做的就是创建SomethingStarted
一个事件并覆盖add
和remove
访问器以将值转发给该Instance.Started
事件:
public event EventHandler<EventArgs> SomethingStarted
{
add => Instance.Started += value;
remove => Instance.Started -= value;
}
Run Code Online (Sandbox Code Playgroud)
这样,任何订阅都SomethingStarted
将被“重定向”,而Instance.Started
不会导致事件被重新触发。
在内部,这将被翻译成:
public void add_SomethingStarted(EventHandler<EventArgs> eventHandler) {
Instance.add_Started(eventHandler);
}
public void remove_SomethingStarted(EventHandler<EventArgs> eventHandler) {
Instance.remove_Started(eventHandler);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2202 次 |
最近记录: |