具有T属性的类列表

时间:2018-08-16 22:57:58

标签: c# list class generics

我正在尝试创建一个具有T属性的类的列表:

class Test<T> where T : IClass, new()
{
    public T Actor { get { return new T(); } }
    public eEnum { get; set; }
    public String Str { get; set; }
} 

以上是一个示例类,如何创建以上类的列表?

我尝试以下操作均无济于事:

List<Test<IClass>> list = new List<IClass>();

有没有办法像我试图生成的那样创建一个列表?

1 个答案:

答案 0 :(得分:3)

由于已添加通用类型约束new(),因此必须提供具有公共无参数构造函数的类型。接口没有构造函数。因此,您必须指出一个课程。例如

List<Test<MyActorClass>> list = new List<Test<MyActorClass>>();

或删除此new()约束,而添加通用工厂方法

class Test
{
    public T CreateActor<T>()
        where T : IClass, new()
    {
        return new T();
    }

    public MyEnum eEnum { get; set; }
    public string Str { get; set; }
}

只需创建一个列表List<Test>

或通过构造函数注入提供具体的actor类型:

class Test
{
    public Test(IClass actor)
    {
        Actor = actor;
    }

    public IClass Actor { get; }
    public MyEnum eEnum { get; set; }
    public string Str { get; set; }
}

一种更高级的构造是使用非泛型抽象基类并从中派生泛型

abstract class Test
{
    private IClass _actor;
    public IClass Actor
    {
        get {
            if (_actor == null) {
                _actor = CreateActor();
            }
            return _actor;
        }
    }

    public MyEnum eEnum { get; set; }
    public string Str { get; set; }

    protected abstract IClass CreateActor(); // We implement it in the generic class.
}

class Test<T> : Test
    where T : IClass, new()
{
    public new T Actor // Hides inherited member.
    {
        get { return (T)base.Actor;  }
    }

    protected override IClass CreateActor()
    {
        return new T();
    }
}

该列表将再次为List<Test>类型。这样做的好处是,您可以将源自Test的不同类型的类添加到列表中,同时通过具体的Test<T>访问它时,您会有一个强类型的actor。