繁体   English   中英

具有T属性的类列表

[英]List of Class with Property of T

我试图用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>();

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

由于您已经添加了通用类型约束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。

暂无
暂无

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

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