記事の目的
テストを作りたいけど関数のアクセス修飾子がprivateとかinternalだから単体テストを作れない。
↓
Reflectionでできるかも
↓
さすがにドンピシャなのはないけど色んなページを参考にしたらできた!
↓
今後のためにメモっておこう!
コード
/*
HogeProjectのHogeProject.FugaNamespace.PiyoClass.NyanMethodを実行させたい場合を考えます。
HogeProject
→参照設定しているプロジェクト、かつHogeProjectを作成した時に自動でVisualStudioが作ってくれる名前空間。
FugaNamespace
→PiyoClassの属すNamespace。
PiyoClass
→クラス名。インスタンスがinternal PiyoClass(int input)で定義されている。
NyanMethod
→internal int NyanMethod(str input)で定義されている関数。
ってことにしてください
*/varflags=System.Reflection.BindingFlags.Instance|System.Reflection.BindingFlags.NonPublic;varinstance=(HogeProject.FugaNamespace.PiyoClass)System.Activator.CreateInstance(typeof(HogeProject.FugaNamespace.PiyoClass),flags,null,newobject[]{0}// インスタンスに引数を与えてる,null);varmethod=instance.GetType().GetMethod("NyanMethod",flags);varresult=method.invoke(instance,newobject[]("hikisu~"));で、行けるはず。
参考
C#リフレクションTIPS 55連発|Qiita
How do I use reflection to invoke a private method?|StackOverflow
Activator.CreateInstanceを使って型情報からインスタンスを作成する|smdn:総武ソフトウェア推進所