从类型参数T实例化而不允许构造函数参数有什么问题?

本文关键字:参数 什么 问题 构造函数 不允许 类型参数 实例化 | 更新日期: 2023-09-27 18:10:22

如果我有classes:

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

从类型参数T实例化而不允许构造函数参数有什么问题?

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

从docs

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

如果您将Message设置为公共可变属性,您可以这样做:

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

暂不支持。

有一些变通方法:

  • 用接口或类(其中T: MyClass)标记类型T,并设置属性或调用其方法初始化实例。
  • 你的催化剂。激活(慢动态方法)。
  • 最快的动态方法是使用反射找到正确的ConstructorInfo并将其转换为强类型委托(在您的情况下:Func<string, T>)。你可以调用这个委托,它将用给定的参数构造一个实例。

您可以这样做:

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

我是从这个问题得到的:https://stackoverflow.com/a/731637/1522991