1

如果我有课:

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);
4

3 回答 3

2

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

文档

可能的解决方法(不是同一件事)

如果您创建Message公共和可变属性,您可以执行以下操作:

class UselessFactory<T> where T : UselessBase, new()
{
    public T CreateUseless(string msg)
    {
        return new T() { Message = msg };
    }
}
于 2013-04-23T07:58:04.197 回答
1

您可以执行以下操作:

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

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

于 2013-04-23T08:06:35.757 回答
1

目前根本不支持。

有解决方法:

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