繁体   English   中英

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

[英]What's with instantiating from a type parameter T not allowing constructor aguments?

如果我有课程:

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

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

来自文档

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

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

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

您可以执行以下操作:

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

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

目前根本不支持它。

有工作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM