Tengo una clase base que contiene los siguientes eventos:
public event EventHandler Loading;
public event EventHandler Finished;
En una clase que hereda de esta clase base, trato de generar el evento:
this.Loading(this, new EventHandler()); // All we care about is which object is loading.
Recibo el siguiente error:
El evento 'BaseClass.Loading' solo puede aparecer en el lado izquierdo de + = o - = (BaseClass ')
¿Asumo que no puedo acceder a estos eventos de la misma manera que otros miembros heredados?
c#
events
inheritance
jwarzech
fuente
fuente
Respuestas:
Lo que tienes que hacer es esto:
En su clase base (donde ha declarado los eventos), cree métodos protegidos que puedan usarse para generar los eventos:
(Tenga en cuenta que probablemente debería cambiar esos métodos para verificar si tiene que invocar el controlador de eventos o no).
Luego, en las clases que heredan de esta clase base, puede llamar a los métodos OnFinished o OnLoading para generar los eventos:
fuente
Solo puede acceder a un evento en la clase de declaración, ya que .NET crea variables de instancia privadas detrás de escena que realmente contienen al delegado. Haciendo esto..
en realidad está haciendo esto;
y haciendo esto ...
es en realidad esto ...
Por lo tanto, (obviamente) solo puede acceder a la variable de instancia de delegado privado desde la clase de declaración.
La convención es proporcionar algo como esto en la clase de declaración.
Luego puede llamar
OnMyPropertyChanged(EventArgs.Empty)
desde cualquier lugar de esa clase o debajo de la jerarquía de herencia para invocar el evento.fuente
Precisamente. Es habitual proporcionar una función protegida
OnXyz
oRaiseXyz
para cada evento en la clase base para permitir el aumento de clases heredadas. Por ejemplo:Llamado en la clase heredada:
fuente
Puedes probar de esta manera, funciona para mí:
fuente
no para resucitar un hilo viejo pero en caso de que alguien esté mirando, lo que hice fue
Esto le permite heredar el evento en una clase derivada para que pueda invocarlo sin necesidad de ajustar el método manteniendo la sintaxis + =. Supongo que aún podrías hacerlo con los métodos de envoltura si lo hicieras
fuente