これはReflectionによって実行できますが、それは明らかではありません。 C#でイベントを宣言すると、イベント名+ "イベント"のクラスにフィールドが追加されます。フィールドで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 });
}
注これはインスタンスから非公開フィールドを取得が必要ですので、それが唯一のフルに動作することは、信頼し、非常に限られています。
イベントをパラメータとして生成する一般的なRaise()を作成することはできますか?したがって、それはまだクラス内から呼び出されるでしょうか?
はい。これを行うために上記のコードを変更するのはかなり簡単でしょう。単に "myClassInstance"をこれに置き換えてください。 NonPublic BindingFlagはもはや問題にはならないので、実際には完全信頼で正しく動作することができます。
ジェネリックメソッドは、イベントをプロパティとして渡すことができないという問題を引き起こします。エラーは「左手でのみ発生する必要があります」などです。解決策はイベントキーワードを削除することです。イベントは正常に機能しますが問題なく周りを回ることができ、一般的に提起される。 –
ああ、非常に素晴らしいトリック:)私はXXXEventフィールドについて知りませんでした、私はそれが自動的にコンパイラによって生成されると思いますか? –
トーマス:はい。 @ Gaijin:あなたはなぜプロパティとして渡されるイベントが必要ですか?ここでは、名前でイベントを使用しています... –