使用泛型,你可以
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]);
是不是有更短的方式,比如泛型版本?
答案 0 :(得分:21)
最接近的是[{3}}:
object o = Activator.CreateInstance(type);
...但当然这依赖于公共无参数构造函数。 (其他重载允许您指定构造函数参数。)
我在这里使用了一个显式类型的变量,以明确我们真的没有类型本身的变量......你不能写:
Type t = typeof(MemoryStream);
// Won't compile
MemoryStream ms = Activator.CreateInstance(t);
例如,。 CreateInstance
的返回值的编译时类型始终为object
。
请注意,default(T)
不会创建引用类型的实例 - 它为类型提供默认值,这是引用类型的空引用。将其与实际创建新对象的CreateInstance
进行比较。
答案 1 :(得分:14)
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>();
答案 2 :(得分:0)
Activator.CreateInstance(type)