У меня есть базовый класс, который содержит следующие события:
public event EventHandler Loading;
public event EventHandler Finished;
В классе, который наследуется от этого базового класса, я пытаюсь вызвать событие:
this.Loading(this, new EventHandler()); // All we care about is which object is loading.
Я получаю следующую ошибку:
Событие BaseClass.Loading может появляться только в левой части + = или - = (BaseClass ')
Я предполагаю, что не могу получить доступ к этим событиям так же, как другие унаследованные члены?
c#
events
inheritance
jwarzech
источник
источник
Ответы:
Что вы должны сделать, это:
В вашем базовом классе (где вы объявили события) создайте защищенные методы, которые можно использовать для вызова событий:
(Обратите внимание, что вам, вероятно, следует изменить эти методы, чтобы проверить, нужно ли вызывать обработчик событий или нет).
Затем в классах, которые наследуются от этого базового класса, вы можете просто вызвать методы OnFinished или OnLoading, чтобы вызвать события:
источник
Вы можете получить доступ только к событию в объявленном классе, поскольку .NET создает закрытые переменные экземпляра за кулисами, которые фактически содержат делегат. Делая это..
на самом деле делает это;
и делает это ...
на самом деле это ...
Таким образом, вы можете (очевидно) получить доступ только к закрытой переменной экземпляра делегата из объявленного класса.
Соглашение состоит в том, чтобы обеспечить что-то подобное в объявлении класса.
Затем вы можете позвонить
OnMyPropertyChanged(EventArgs.Empty)
из любого места в этом классе или из иерархии наследования, чтобы вызвать событие.источник
Точно. Это общепринято , чтобы обеспечить защищенную функцию
OnXyz
илиRaiseXyz
для каждого события в базовом классе , чтобы дать возможность повышения унаследованных классов. Например:Вызывается в унаследованном классе:
источник
Вы можете попробовать этот способ, это работает для меня:
источник
не воскрешать старую ветку, но на случай, если кто-то ищет, я сделал
Это позволяет вам наследовать событие в производном классе, чтобы вы могли вызывать его без необходимости переноса метода, сохраняя синтаксис + =. Я думаю, вы могли бы сделать это с помощью методов упаковки, если вы сделали
источник