コールバックソリューションと各クラスのイベントチェーンを回避するには、基本的に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);
}
}
「アクション」タイプは新しいですか?私はC#2.0のみを使用しています。代わりに 'delegate'を使用できますか? –
@PaulLassiterアクションはパラメータとvoid型の戻り値を持たないデリゲートです。あなたは自分で同等のものを定義することができます。 –
パブリックデリゲートvoid Action(); –