すべてのクラスでコールバック ソリューションと一連のイベントを回避したい場合は、基本的に 2 つのソリューションがあります。
最初のものは、タイプ MyClassX のローカル変数をフィールドに変換することで構成されます。つまり、Chris Gessler が提案したようなものですが、このアプローチに完全に従い、ローカル変数を削除します。
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();
}
}
あなたの他のオプション(ただし、実行可能かどうかは実際に何をしようとしているかに依存しますが、とにかく好きではありません)は、単に MyClass3 のイベントを静的として定義することです:
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);
}
}