Si se quiere evitar la solución de devolución de llamada y la cadena de acontecimientos en cada clase, que básicamente tienen 2 soluciones.
El primero consiste en convertir las variables locales de tipo MyClassX en campos, es decir, algo como sugirió Chris Gessler, pero siguiendo completamente este enfoque y eliminando los valores locales.
public static void main() {
MyClass1 obj = new MyClass1();
obj.c2.c3.SomeEvent += obj_SomeEvent;
obj.Method1();
}
private static void obj_SomeEvent(object sender, EventArgs e)
{
Console.WriteLine("Some event fired");
}
public class MyClass1() {
public MyClass2 c2 = new MyClass2();
public void Method1() {
c2.Method1();
}
}
public class MyClass2() {
public MyClass3 c3 = new MyClass3();
public void Method1() {
c3.Method1();
}
}
public class MyClass3() {
public event EventHandler SomeEvent;
private void OnSomeEvent()
{
if (SomeEvent!= null)
{
SomeEvent(this, new EventArgs());
}
}
public void Method1() {
OnSomeEvent();
}
}
Su otra opción (pero realmente depende de lo que está tratando de hacer, si es factible, y no me gusta de todos modos) es simplemente definir el evento en MyClass3 como estática:
public static void main() {
MyClass3.SomeEvent += obj_SomeEvent;
MyClass1 obj = new MyClass1();
obj.Method1();
}
private static void obj_SomeEvent(object sender, EventArgs e)
{
Console.WriteLine("Some event fired");
}
public class MyClass1() {
public void Method1() {
MyClass2 obj = new MyClass2();
obj.Method1();
}
}
public class MyClass2() {
public void Method1() {
MyClass3 obj = new MyClass3();
obj.Method1();
}
}
public class MyClass3() {
public static event EventHandler SomeEvent;
private void OnSomeEvent(MyClass3 anObj)
{
if (SomeEvent!= null)
{
SomeEvent(anObj, new EventArgs());
}
}
public void Method1() {
OnSomeEvent(this);
}
}
¿El tipo 'Action' es nuevo? Solo estoy usando C# 2.0. ¿Se podría usar un "delegado" en su lugar? –
@PaulLassiter Action es solo un delegado sin parámetros y tipo de devolución de nulo. Puedes definir algo equivalente por ti mismo. –
delegado público void Acción(); –