web-dev-qa-db-ja.com

C#リフレクションを使用してコンストラクターを呼び出す

次のシナリオがあります。

_class Addition{
 public Addition(int a){ a=5; }
 public static int add(int a,int b) {return a+b; }
}
_

私は別のクラスでaddを呼び出しています:

_string s="add";
typeof(Addition).GetMethod(s).Invoke(null, new object[] {10,12}) //this returns 22
_

Addition(int a)を使用して、Addition型の新しいオブジェクトを作成するには、上記のリフレクションステートメントと同様の方法が必要です。

文字列_s= "Addition"_があるので、リフレクションを使用して新しいオブジェクトを作成します。

これは可能ですか?

86
scatman

私はGetMethodがそれを行うとは思わない、いいえ-しかし GetConstructor はそうするでしょう。

using System;
using System.Reflection;

class Addition
{
    public Addition(int a)
    {
        Console.WriteLine("Constructor called, a={0}", a);
    }
}

class Test
{
    static void Main()
    {
        Type type = typeof(Addition);
        ConstructorInfo ctor = type.GetConstructor(new[] { typeof(int) });
        object instance = ctor.Invoke(new object[] { 10 });
    }
}

編集:はい、Activator.CreateInstanceも機能します。物事をより細かく制御したい場合は、GetConstructorを使用します。パラメータ名などを見つけます。Activator.CreateInstanceは、justコンストラクターを呼び出したい場合に最適です。

155
Jon Skeet

はい、使用できます Activator.CreateInstance

44
Ben Voigt