您可以看到我正在尝试(但失败)使用以下代码执行的操作:
protected T GetObject() { return new T(); }
任何帮助将不胜感激。
编辑:
上下文如下。我正在使用标准化方法为所有控制器派生一个自定义控制器类。因此,在上下文中,我需要创建控制器类型对象的新实例。所以在写这篇文章的时候,它是这样的:
public class GenericController<T> : Controller { ... protected T GetObject() { return (T)Activator.CreateInstance(ObjectType); } public ActionResult Create() { var obj = GetObject() return View(obj); }
所以我决定在这里反思是最容易的。我同意,当然考虑到问题的初始陈述,标记为正确的最合适的答案是使用 new() 约束的答案。我已经解决了。
看看新的约束
public class MyClass<T> where T : new() { protected T GetObject() { return new T(); } }
T可能是一个没有默认构造函数的类:在这种情况下new T()将是一个无效的语句。new()约束说必须有一个默认构造函数,这T使得new T()合法。
T
new T()
new()
您可以将相同的约束应用于泛型方法:
public static T GetObject<T>() where T : new() { return new T(); }
如果需要传递参数:
protected T GetObject(params object[] args) { return (T)Activator.CreateInstance(typeof(T), args); }