【问题标题】:List of Class with Property of T具有 T 属性的类列表
【发布时间】:2018-08-16 22:57:57
【问题描述】:

我正在尝试创建一个具有 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>();

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

【问题讨论】:

  • 你不应该做List&lt;Test&lt;IClass&gt;&gt; list = new List&lt;Test&lt;IClass&gt;&gt;();吗?
  • 是的,您需要让右侧的初始化程序与左侧的变量类型匹配。尽管我确实想知道,您在类型参数约束中拥有的 new() 看起来您需要一个新的 IClass 实例,但您实际上只需要该类型。由于您的 Actor 正在处理更新,我建议删除 new() 约束。
  • @TurnerBass new() constraint 指定类型T 必须有一个公共的无参数构造函数(这使得Actor 方法能够调用new T()
  • 是的,没错。但列表初始化仍然是主要问题
  • @TurnerBass 如果 OP 删除了 new() 约束,该类将不再编译。

标签: c# list class generics


【解决方案1】:

由于您添加了泛型类型约束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&lt;Test&gt;

或者通过构造函数注入提供一个具体的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&lt;Test&gt; 类型。这样做的好处是,您可以将派生自 Test 的不同类型的类添加到列表中,同时在通过具体的 Test&lt;T&gt; 访问它时,您有一个强类型的参与者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多