これはReflectionを介して行うことができますが、それは明らかではありません。C#でイベントを宣言すると、イベント名+"Event"のフィールドがクラスに追加されます。フィールドでGetValueを呼び出すと、MulticastDelegateインスタンスが返されます。
MulticastDelegateを入手したら、呼び出しリストを取得して、各メンバーを順番に呼び出すことができます。
EventArgs e = new EventArgs(myClassInstance); // Create appropriate EventArgs
MulticastDelegate eventDelagate =
this.GetType().GetField(theEventName + "Event",
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.NonPublic).GetValue(myClassInstance) as MulticastDelegate;
Delegate[] delegates = eventDelagate.GetInvocationList();
foreach (Delegate del in delegates) {
del.Method.Invoke(del.Target, new object[] { myClassInstance, e });
}
これにはインスタンスからNonPublicフィールドを取得する必要があるため、完全に信頼してのみ機能し、非常に制限されていることに注意してください。
発生するイベントをパラメーターとして受け入れるジェネリックRaise()を作成することは可能ですか?したがって、それでもクラス内から呼び出されますか?
はい。これを行うために上記のコードを変更するのはかなり簡単です。「myClassInstance」をこれに置き換えるだけです。NonPublic BindingFlagは問題ではなくなるため、これにより、これが完全に信頼できる状態で適切に機能するようになります。