0. はじめに
やたら情報量が多いタイトルになってしまった🙄
公開(アクセシビリティがpublic)されているクラスの非公開メソッドを直接実行したい場合は、リフレクションで実行すればOKかと思います。
あくまでテストのためですよ?テスト以外ではそんなことになってしまう設計がダメですね😇
しかし、
別アセンブリ かつ 非公開(アクセシビリティがinternal)
のメソッドを実行する必要があったので、そのときやった方法を備忘録として残しておきたいと思います。
あくまでテストのためですよ?(略)
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. おわりに
ベストプラクティスじゃなかったらごめんなさい。