我正在尝试创建一个具有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>();
有没有办法像我试图生成的那样创建一个列表?
答案 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。