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.