題名 | 著者 | 日付 | CREATETIME | カテゴリ |
---|---|---|---|---|
プライベートイベントを呼び出すためのC#のリフレクション
|
lindexi
|
2019年11月29日午前8時51分13秒0800
|
2018年9月19日夜08時44分19秒0800
|
C#のリフレクション
|
プライベートイベント呼び出すためにC#の反射では、多くの場合、通話にどのように伝えるために、この記事を書く方法を知りません。
クラスコードがプライベートイベントを定義すると仮定
クラス A
{ プライベートイベントのEventHandler Fxの
{ アドオン {}
削除 {}
}
}
反射がイベントを介して取得することができますが、イベントを直接追加することはできませんFxの
VAR eventInfo = typeof演算(A)。GetEvent("為替"、のBindingFlags。インスタンス | のBindingFlags。非公開)。
あなたが呼び出す場合AddEventHandlerは、直接の異常の下に表示されます
VAR eventInfo = typeof演算(A)。GetEvent("為替"、のBindingFlags。インスタンス | のBindingFlags。非公開)。VaRのAは= 新しいA(); eventInfo。AddEventHandler(、新しいイベントハンドラ(為替)); ボイドのFx(オブジェクト送信者、のEventArgsのE)
{
}
システムが。InvalidOperationExceptionが:「このイベントを追加するパブリックメソッドが存在しないとして、それはイベントハンドラを追加することはできません。」
解決策はGetAddMethod以下のメソッドを参照してくださいを呼び出すことです
VAR eventInfo = typeof演算(A)。GetEvent("為替"、のBindingFlags。インスタンス | のBindingFlags。非公開)。
VAR addFx = eventInfo。GetAddMethod(真の);
VAR removeFx = eventInfo。GetRemoveMethod(真の); VaRのAは= 新しいA(); addFx。呼び出し(
、新 [] { 新しい イベントハンドラ(為替)})。
removeFx。呼び出し(、新しい [] { 新しいイベントハンドラ(為替)})。ボイドのFx(オブジェクト送信者、のEventArgsのE)
{
}
参照してくださいhttps://stackoverflow.com/a/6423886/6116637を
あなたが異常な型変換が発生する可能性があります場合はSystem.ArgumanetException:'Object of type 'System.EventHandler1[System.EventArgs]' cannot be converted to type 'System.EventHandler'.
、参照反射登録イベントを使用して.NET / C# - walterlvを
より多くの反射を参照してください。
大幅に反射コールのパフォーマンスを改善するための委員会を作成するには、.NETのコア/フレームワーク - walterlv
(特にUWP用)リフレクターをサポートするために、.NETネイティブランタイム命令セット - walterlv
.NET / C#を含むrefまたはメソッドのパラメータ外を呼び出すためにリフレクションを使用して - walterlv
.NET / C#Iキャッシュ設計(反射の動作抵抗性能キャッシュ、添付の使用)のタイプをお勧めします - walterlvを