Подтвердить что ты не робот

Как создать экземпляр для данного типа?

С помощью дженериков вы можете

var object = default(T);

Но когда все, что у вас есть, это экземпляр типа, я мог бы только

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]);

Нет ли более короткого пути, например, версии generics?

4b9b3361

Ответ 1

Ближайший доступный Activator.CreateInstance:

object o = Activator.CreateInstance(type);

... но, конечно, это зависит от наличия открытого конструктора без параметров. (Другие перегрузки позволяют указать аргументы конструктора.)

Я использовал явно типизированную переменную здесь, чтобы было ясно, что у нас действительно нет переменной самого типа... вы не можете написать:

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

например. Тип возвращаемого значения времени CreateInstance всегда является object.

Обратите внимание, что default(T) не будет создавать экземпляр ссылочного типа - он дает значение по умолчанию для типа, которое является пустой ссылкой для ссылочных типов. Сравните это с CreateInstance, который фактически создал бы новый объект.

Ответ 2

var myObject = Activator.CreateInstance(myType)

Вы должны использовать, если хотите использовать типизированный параметр:

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

.. или с параметрами

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

Вы также можете использовать generics:

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

var user = Create<User>();

Ответ 3

Activator.CreateInstance(type)