別アセンブリの非公開クラスのメソッドをリフレクションで実行する方法

スポンサーリンク

やたら情報量が多いタイトルになってしまった🙄

基本的に、公開(アクセシビリティがpublic)されているクラスに対しては普通にリフレクションで実行していました。

あくまでテストのためですよ?テスト以外ではそんなことになってしまう設計がダメですね😇

しかし、

  • 別アセンブリ かつ 非公開(アクセシビリティがinternal)

のメソッドを実行する必要があったので、そのときやった方法を備忘録として残しておきたいと思います。

var hogeType = Type.GetType("Hoge.Logger, LoggerLib"); // ①
var hogeImpl = Activator.CreateInstance(hogeType, xxx); // ②
var writeMethod = loggerImpl.GetType().GetMethod("Write", new[] { typeof(string), typeof(string) }); // ③
writeMethod.Invoke(hogeImpl, new object[] { title, message }); // ④
① Type.GetType(“名前空間.クラス名, アセンブリ名”)を指定し、非公開クラスを取得します。
② ①で取得したクラスのインスタンスを生成します。
コンストラクタ引数がある場合は、例みたいにCreateInstance()の第2引数にパラメータを指定します。
コンストラクタ引数がない場合は、指定不要です。
③ リフレクションで対象のメソッドを指定します。
オーバーロードがある場合は、例みたいにGetMethod()の第2引数にパラメータを指定します。
コンストラクタ引数がない場合は、指定不要です。
④ Invoke()で実行します。
以上です!

コメント

タイトルとURLをコピーしました