2017-01-24 7 views
1

にType.GetMemberとプライベートフィールドにアクセスすることはできませんホストApplication.Currentメンバーは「_ownDispatcherStarted」である場合、例えば、それは空の配列を返しますが、もしあれば私はプライベートプロパティを探します。例えばメンバーは "ParkingHwnd"です。長さ1の配列を返します。それは大丈夫です。何故ですか?次のコードは、プライベートフィールドを見つけることができないWPF

 var hostType = host.GetType(); 
     var members = host.GetType() 
      .GetMember(member, Public | NonPublic | Instance); 

答えて

3

私はちょうどいくつかの実験を行いました。ドキュメントによると、継承されたメンバーを除外するには、BindingFlags.DeclaredOnlyを指定する必要がありますが、私のテストでは、継承されたメンバーをGetMember,GetFieldsまたはGetFieldの戻り値で表示することができませんでした。

デフォルトのWPFアプリケーションでは、Application.CurrentApplicationのインスタンスではなく、Applicationのサブクラスであり、App.xamlで定義されています。 host.GetType().BaseTypeを使用すると、_ownDispatcherStartedなどのフィールドが検出可能であることがわかりました。

したがって、Applicationベースクラスで宣言されたフィールドを一般的に検索するには、探しているメンバーを見つけ出すか、ルートにヒットするまで、BaseTypeに続けて継承ツリーを歩かなければならない場合があります。

これは私が期待した結果ではありませんが、うまくいけばそれはあなたを得るでしょう。 :-)

+0

良いキャッチ。私はこれを試して、どこにもいない。私は 'FlattenHierarchy'フラグを渡していましたが、あなたが継承したプライベートフィールドを取得しないことが分かります:"階層の上のパブリックメンバーとプロテクトされた静的メンバーを返すように指定します " –

+0

ええ、' FlattenHierarchy'は静的メンバー用です。ドキュメンテーションは、インスタンスメンバーがデフォルトでインクルードされるべきであることを意味し、 'DeclaredOnly'にそれらを含めることをオプトアウトすることができますが、私のテストではその結果は表示されませんでした。 –

+0

ジョナサンに感謝します。私はあなたが 'Application.Current'についてどういう意味をしているのか見ています。実際のタイプは' MyApplicationNamespace.App'です。 –