2010年1月1日金曜日

[.NET]プライベートコンストラクタのクラスを強引にインスタンス化する

privateコンストラクタしかないクラスや都合によりprivateコンストラクタからインスタンス化したい場合、Activator.CreateInstanceでは、MissingMethodExceptionが発生してしまいます。
こういう場合、Typeからコンストラクタを取り出し、そこからインスタンス化します。コードはこんな感じ。

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //using System.Reflection;
            MethodBase.GetCurrentMethod();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            Type tp = typeof(PrivateConst);
            ConstructorInfo ci =  tp.GetConstructors(BindingFlags.NonPublic| BindingFlags.Instance)[0];

            object obj = ci.Invoke(new object[] { });

            System.Diagnostics.Debug.WriteLine("Type=" + obj.GetType());

            //「Type=WindowsFormsApplication1.PrivateConst」と表示された
        }
    }

    class PrivateConst
    {
        private PrivateConst()
        {
        }
    }
}

0 件のコメント :