[英]A Class with List(T) property inside a Class with a List(T) property
[英]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.