utilice una sirve que para palabra objeto new metodos instancia crear c# events inheritance

una - para que sirve el override en c#



¿Llamar a eventos C#desde fuera de la clase propietaria? (3)

Debería envolver el código que desea ejecutar desde el exterior en un método. Ese método puede hacer lo que haga su evento, y ese evento también llamará a ese método.

¿Es posible bajo cualquier circunstancia ser capaz de lograr esto?

Mis circunstancias actuales son las siguientes:

public class CustomForm : Form { public class CustomGUIElement { ... public event MouseEventHandler Click; // etc, and so forth. ... } private List<CustomGUIElement> _elements; ... public void CustomForm_Click(object sender, MouseEventArgs e) { // we might want to call one of the _elements[n].Click in here // but we can''t because we aren''t in the same class. } }

Mi primer pensamiento fue tener una función similar a:

internal enum GUIElementHandlers { Click, ... } internal void CustomGUIElement::CallHandler(GUIElementHandler h, object[] args) { switch (h) { case Click: this.Click(this, (EventArgs)args[0]); break; ... // etc and so forth } }

Es un error horriblemente feo, pero debería funcionar ... Sin embargo, debe haber una solución más elegante. La biblioteca .NET hace esto todo el tiempo con controladores de mensajes y eventos de llamada en Control. ¿Alguien más tiene alguna otra / mejor idea?


Solo necesita agregar un método público para invocar el evento. Microsoft ya hace esto para algunos eventos como PerformClick para controles que exponen un evento Click .

public class CustomGUIElement { public void PerformClick() { OnClick(EventArgs.Empty); } protected virtual void OnClick(EventArgs e) { if (Click != null) Click(this, e); } }

Luego, haría lo siguiente dentro de su controlador de eventos de ejemplo ...

public void CustomForm_Click(object sender, MouseEventArgs e) { _elements[0].PerformClick(); }


La palabra clave del evento en c # modifica la declaración del delegado. Impide la asignación directa al delegado (solo puede usar + = y - = en un evento) e impide la invocación del delegado desde fuera de la clase.

Entonces, podrías alterar tu código para que se vea así:

public class CustomGUIElement { ... public MouseEventHandler Click; // etc, and so forth. ... }

Entonces puedes invocar el evento desde fuera de la clase de esta manera.

myCustomGUIElement.Click(sender,args);

El inconveniente es que el código que utiliza la clase puede sobrescribir fácilmente cualquier controlador registrado con un código como este:

myCustomGUIElement.Click = null;

que no está permitido si el delegado Click se declara como un evento.