如何在泛型类型的构造函数中分配泛型类型的成员?

时间:2012-02-18 18:46:06

标签: c# generics

如何在泛型C#类中分配值?

public class GeneralWrapper<T>
{
    public GeneralWrapper()
    {
       Datas = new ?
    }

    public T Datas { get; set; }
}

我正在为List对象(任何对象)编写通用的包装类。所以我可以像

一样使用这个类
GeneralWrapper<List<string>> _wrapper = new GeneralWrapper<List<string>>();
_wrapper.Datas.Add("hello")

但是数据需要在构造函数中自动初始化,如

Datas = new Datas<t>();

似乎我在创建GeneralWrapper类之后不必创建新的。

3 个答案:

答案 0 :(得分:5)

您可以在通用类型上使用constraint

public class GeneralWrapper<T> where T: new()
{
    public GeneralWrapper()
    {
       Datas = new T();
    }

    public T Datas { get; set; }
}

new()约束表明T必须是拥有默认无参数构造函数的类型。这在编译时得到验证,允许您从泛型类中实例化该对象。

答案 1 :(得分:2)

public class GeneralWrapper<T> where T : class, new()
{
    public GeneralWrapper()
    {
       Datas = new T();
    }

    public T Datas { get; set; }
}

http://msdn.microsoft.com/en-us/library/sd2w2ew5.aspx有答案。

答案 2 :(得分:2)

在C#中创建泛型类型参数实例的能力非常有限。默认情况下,您实际上只有几个选项

  • T约束为new(),允许new T()
  • T约束为class,允许null
  • 使用适用于所有default(T)
  • T

这里虽然看起来你想要使用复杂的构造函数(那些至少需要一个参数的构造函数)。在C#中无法直接执行此操作。相反,您需要一个更为间接的机制,如委托/ lambda或工厂模式。

在这种情况下,虽然看起来您想要为Datas分配初始值。鉴于它是一个公共属性,最好的方法是不做任何事情并允许消费者使用对象初始化器来自己设置属性。例如。

var x = new GeneralWrapper<MyType>() {
  Datas = new MyType("hello", "world");
};

或者,如果您希望始终指定值,则强制它们将值传递给构造函数

public GeneralWrapper(T datas) {
  Datas = datas;
}