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

C#

0. はじめに

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

公開(アクセシビリティがpublic)されているクラスの非公開メソッドを直接実行したい場合は、リフレクションで実行すればOKかと思います。

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

しかし、

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

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

:::note warn あくまでテストのためですよ?(略) :::

1. やったこと

// Type.GetType("名前空間.クラス名, アセンブリ名")を指定し、非公開クラスを取得します。
var hogeType = Type.GetType("Hoge.Logger, LoggerLib");

// ↑で取得したクラスのインスタンスを生成します。
// コンストラクタ引数がある場合は、例みたいにCreateInstance()の第2引数にパラメータを指定します。
// コンストラクタ引数がない場合は、指定不要です。
var hogeImpl = Activator.CreateInstance(hogeType, xxx);

// リフレクションで対象のメソッドを指定します。
// オーバーロードがある場合は、例みたいにGetMethod()の第2引数にパラメータを指定します。
// コンストラクタ引数がない場合は、指定不要です。
var writeMethod = loggerImpl.GetType().GetMethod("Write", new[] { typeof(string), typeof(string) });

// 実行します。
writeMethod.Invoke(hogeImpl, new object[] { title, message });

2. おわりに

ベストプラクティスじゃなかったらごめんなさい。