web-dev-qa-db-ja.com

Reflectionを使用して内部クラスにアクセスする方法

アセンブリの内部クラスにアクセスするにはどうすればよいですか? System.ComponentModel.Design.DesignerHostにアクセスしたいとします。ここで、DesignerHostは内部の密閉されたクラスです。

アセンブリと型をロードするコードを作成するにはどうすればよいですか?.

62
dattebayo

一般に、あなたはこれを行うべきではありません-タイプが内部としてマークされている場合、それはアセンブリの外部からそれを使用するつもりがないことを意味します。後のバージョンで削除、変更などされる可能性があります。

ただし、リフレクションdoesを使用すると、パブリックではない型やメンバーにアクセスできます。BindingFlags引数を取るオーバーロードを探すだけで、渡すフラグにBindingFlags.NonPublicを含めます。

完全修飾された型の名前(アセンブリ情報を含む)がある場合は、 Type.GetType(string)を呼び出すだけです 動作するはずです。事前にアセンブリを知っていて、そのアセンブリ内のパブリックタイプを知っている場合、typeof(TheOtherType).Assemblyを使用してアセンブリ参照を取得する方が一般的に簡単で、 Assembly.GetType(string)

96
Jon Skeet

例で引用したアセンブリをロードして入力するには:

Assembly design = Assembly.LoadFile(@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Design.dll");
Type designHost = design.GetType("System.ComponentModel.Design.DesignerHost");
14