Как создать экземпляр для данного типа?
С помощью дженериков вы можете
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?
Ответы
Ответ 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)