从类型参数T实例化不允许构造函数参数是什么?

时间:2013-04-23 07:52:08

标签: c# .net generics instantiation

如果我有课程:

class Useless
{
    private string _message ;
    public Useless(string message)
    {
        _message = message;
    }
}

class UselessFactory<T> where T : new()
{
    public Useless CreateUseless(string msg)
    {
        return new T(msg);
    }
}

为什么我不能用参数实例化T,就像我可以用以下内容一样?

return (Useless)Activator.CreateInstance(typeof(T), msg);

3 个答案:

答案 0 :(得分:2)

  

新约束指定泛型类声明中的任何类型参数都必须具有公共无参数构造函数。

来自the docs

可能的解决方法(不一样)

如果您将Message设为公共和可变属性,则可以执行以下操作:

class UselessFactory<T> where T : UselessBase, new()
{
    public T CreateUseless(string msg)
    {
        return new T() { Message = msg };
    }
}

答案 1 :(得分:1)

您可以执行以下操作:

return (T)Activator.CreateInstance(typeof(T), new object[] { msg });

我从这个问题中得到了它:https://stackoverflow.com/a/731637/1522991

答案 2 :(得分:1)

目前根本不支持。

有解决方法:

  • 使用接口或类(其中为T:MyClass)标记类型T并设置属性或调用其方法来初始化实例。
  • 你的Activator.Activate(一种缓慢的动态方法)。
  • 最快的动态方法是一次使用反射来查找正确的ConstructorInfo并将其转换为强类型的委托(在您的情况下:Func<string, T>)。您可以调用此委托,该委托将使用给定参数构造实例。