你可以看到我试图(但失败)用下面的代码做什么:

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()合法。

你可以把同样的约束应用到一个泛型方法上:

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

如果你需要传递参数:

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

另一种方法是使用反射:

protected T GetObject<T>(Type[] signature, object[] args)
{
    return (T)typeof(T).GetConstructor(signature).Invoke(args);
}

为了完成,这里最好的解决方案通常是需要一个工厂函数参数:

T GetObject<T>(Func<T> factory)
{  return factory(); }

我们可以这样称呼它:

string s = GetObject(() => "result");

如果需要,您可以使用它来要求或使用可用参数。


为什么没有人推荐Activator ?CreateInstance除外?

http://msdn.microsoft.com/en-us/library/wccyzw83.aspx

T obj = (T)Activator.CreateInstance(typeof(T));

新的约束是好的,但如果你需要T也是一个值类型,使用这个:

protected T GetObject() {
    if (typeof(T).IsValueType || typeof(T) == typeof(string)) {
        return default(T);
    } else {
       return (T)Activator.CreateInstance(typeof(T));
    }
}

因为它被标记为c# 4。使用开源框架impromptuinterface,它将使用dlr来调用构造函数,当构造函数有参数时,它比Activator快得多,而当构造函数没有参数时,它的速度可以忽略不计。然而,主要的优点是它可以正确地处理带有c# 4.0可选参数的构造函数,这是Activator无法做到的。

protected T GetObject(params object[] args)
{
    return (T)Impromptu.InvokeConstructor(typeof(T), args);
}

为了得到这个,我尝试了以下代码:

  protected T GetObject<T>()
    {
        T obj = default(T);
        obj =Activator.CreateInstance<T>();
        return obj ;
    }

我试着

if (typeof(T).IsValueType || typeof(T) == typeof(string))
                        return default(T);
                    return Activator.CreateInstance<T>();

但是当运行它时,它在返回Activator.CreateInstance<T>()时抛出了这个错误;

System.MissingMethodException: 'No parameterless constructor defined for this object.'

T的类型是int和List<int>