C# 通过属性公开事件

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是它的实例AnotherClassInstance.Started定义AnotherClass如下:

public event EventHandler<EventArgs> Started;
Run Code Online (Sandbox Code Playgroud)

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

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

Ima*_*tas 8

事件没有 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;
}
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)