web-dev-qa-db-ja.com

特定のタイプのインスタンスを作成するにはどうすればよいですか?

ジェネリックでできること

var object = default(T);

しかし、あなたが持っているのがTypeインスタンスだけであるとき、私は

constructor = type.GetConstructor(Type.EmptyTypes);
var parameters = new object[0];
var obj = constructor.Invoke(parameters);

あるいは

var obj = type.GetConstructor(Type.EmptyTypes).Invoke(new object[0]);

ジェネリック版のような短い方法はありませんか?

19
Jader Dias

最も近いものは _Activator.CreateInstance_ です。

_object o = Activator.CreateInstance(type);
_

...もちろん、これはパブリックパラメータレスコンストラクタの存在に依存しています。 (他のオーバーロードでは、コンストラクター引数を指定できます。)

ここでは明示的に型付けされた変数を使用して、型自体の変数が実際にはないことを明確にしています...書くことはできません。

_Type t = typeof(MemoryStream);
// Won't compile
MemoryStream ms = Activator.CreateInstance(t);
_

例えば。 CreateInstanceの戻り値のコンパイル時の型は、常にobjectです。

default(T)は参照タイプのインスタンスを作成しないことに注意してください。これにより、タイプのデフォルト値が与えられます。参照型のnull参照。実際に新しいオブジェクトを作成するCreateInstanceと比較してください。

21
Jon Skeet

var myObject = Activator.CreateInstance(myType)

型付きパラメーターを使用する場合は、キャストする必要があります。

User user = (User)Activator.CreateInstance(typeof(User));

..またはパラメータ付き

User user = (User)Activator.CreateInstance(typeof(User), new object[]{firstName, lastName});

ジェネリックを使用することもできます:

public T Create<T>() where T : class, new()
{
    return new T();
}

var user = Create<User>();
14
jgauffin
Activator.CreateInstance(type)
0
M.A. Hanin