C # выставлять события со свойствами - PullRequest
0 голосов
/ 21 декабря 2018

Мне нужно выставить событие экземпляра класса, используя свойство из другого класса.

Если я выставлю событие, определенное в MyClass, со свойством, определенным в том же MyClass,так что событие работает как вспомогательное поле, все в порядке:

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

Может звучать странно, но может быть полезно по какой-то причине.

Но если я выставлю (в том жеобразом) событие, определенное в AnotherClass, доступ к которому осуществляется экземпляром этого AnotherClass, следующим образом:

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

, где Instance - это экземпляр этого AnotherClass, и определено Instance.Startedв AnotherClass следующим образом:

public event EventHandler<EventArgs> Started;

тогда я получаю сообщение об ошибке: «Событие может появляться только на левой стороне».

Я просто не понимаю, почему первыйСлучай разрешен, а второй нет, хотя они кажутся очень похожими.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

У событий нет ни методов получения, ни установок, они имеют только методы доступа 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;
}

Таким образом, любая подписка на 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);
}
0 голосов
/ 21 декабря 2018

Мне нужно предоставить событие экземпляра класса, используя свойство другого класса.

Вы не должны использовать события таким образом.Событие всегда должно отображаться как event.
. Что вы можете сделать, так это показать событие другого класса через свой собственный класс:

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

Таким образом, подписчик фактически подпишется на Instance событие.Вы можете связать его с методом и повторно запустить событие, чтобы изменить sender.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...