Her sınıftaki geri arama çözümü ve olay zincirinden kaçınmak istiyorsanız, temel olarak 2 çözümünüz vardır. Birincisi, MyClassX tipi lokal değişkenleri alanlara çevirmekten, yani Chris Gessler'in önerdiği gibi, ancak bu yaklaşımı tamamen takip ederek ve yerel varsları silmekten ibarettir.
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();
}
}
Diğer seçenek sadece statik olarak MyClass3 olay tanımlamak için (ancak gerçekten uygun olup olmadığını yapmaya çalıştıkları bağlıdır ve yine de sevmiyorum):
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);
}
}
'Action 'türü yeni mi? Sadece C# 2.0 kullanıyorum. Bunun yerine bir 'delege' kullanılabilir mi? –
@PaulLassiter Eylem parametreler ve geçersiz dönüş tipi olmayan bir temsilci. Kendinize eşdeğer bir şey tanımlayabilirsiniz. –
public delegate void Action(); –