個人的備忘録

調べたり思いついたりした事の置き場

privateなコンストラクタしか持たないクラスをリフレクションで生成する

テスト等で、Privateなコンストラクタしか持たないクラスを生成したくなることがある。
コンストラクタが引数を取らない場合、Activatorを利用すれば簡単にできる。

class Test
{
    private Test()
    {
    }
}
var obj = (Test)Activator.CreateInstance(typeof(Test), true);

引数を取る場合、もう少し複雑な別のオーバーロードを利用しなければならない。
以下のようになる。

class Test2
{
    public string Str { get; private set; }
    private Test2(string str)
    {
        Str = str;
    }
}
var flags = System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic;

var obj2 = (Test2)Activator.CreateInstance(typeof(Test2), flags, null, new object[] { "test" }, null);