一尘不染

C#创建新的T()

c#

您可以看到我正在尝试(但失败)执行以下代码:

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()约束的答案。我已经解决了。


阅读 1085

收藏
2020-05-19

共1个答案

一尘不染

看看新的约束

public class MyClass<T> where T : new()
{
    protected T GetObject()
    {
        return new T();
    }
}

T可能是没有默认构造函数的类:在这种情况下,new T()它将是无效的语句。该new()约束说,T必须有一个默认的构造,这使得new T()法律。

您可以将相同的约束应用于通用方法:

public static T GetObject<T>() where T : new()
{
    return new T();
}

如果您需要传递参数:

protected T GetObject(params object[] args)
{
    return (T)Activator.CreateInstance(typeof(T), args);
}
2020-05-19