ジェネリックでできること
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]);
ジェネリック版のような短い方法はありませんか?
最も近いものは _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
と比較してください。
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>();
Activator.CreateInstance(type)