小编典典

C# 创建新的 T()

all

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

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


阅读 61

收藏
2022-07-09

共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);
}
2022-07-09