1

我需要使用来自不同类的属性公开类实例的事件。

MyClass如果我使用在中定义的属性公开在中定义的MyClass事件,以便该事件像支持字段一样工作,一切都很好:

private event EventHandler<EventArgs> _somethingHappened;
public EventHandler<EventArgs> SomethingHappened
{
     get => _somethingHappened;
}

听起来可能很奇怪,但出于某种原因它可能很有用。

但是,如果我(以相同的方式)公开一个AnotherClass由 that 的实例访问的事件AnotherClass,如下所示:

public EventHandler<EventArgs> SomethingStarted
{
    get => Instance.Started;
}

其中Instance是那个实例,AnotherClass定义Instance.Started如下AnotherClass

public event EventHandler<EventArgs> Started;

然后我得到错误:“事件只能出现在左侧”。

我只是不明白为什么允许第一种情况而不允许第二种情况,尽管它们看起来非常相似。

4

2 回答 2

5

事件没有 getter 或 setter,它们只有addremove访问器,因此它们不能用作属性。

通过代码get => Instance.Started,您试图获取的值Instance.Started但没有吸气剂。

您可以做的也是创建SomethingStarted一个事件并覆盖addremove访问器以将值转发给Instance.Started事件:

public event EventHandler<EventArgs> SomethingStarted
{
    add => Instance.Started += value;
    remove => Instance.Started -= value;
}

这样,任何订阅都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);
}
于 2018-12-21T15:14:23.777 回答
2

我需要使用来自不同类的属性公开类实例的事件。

您不应该以这种方式使用事件。事件应始终以event.
您可以做的是通过您自己的类公开其他类的事件:

public event EventHandler<EventArgs> SomethingHappened
{
    add => Instance.Started += value;
    remove => Instance.Started -= value;
}

这样,订阅者将实际订阅Instance' 事件。您可以将其包装到一个方法中并重新触发一个事件以更改sender.

于 2018-12-21T15:08:44.133 回答