将List <childclass>启动到List <parentclass>中

时间:2016-01-07 08:29:28

标签: c#

找到这个问题的正确单词我遇到了麻烦,所以我会尝试用一些代码向你展示我的问题。

我有一个父类,如下所示:

public class ParentClass {
    public Guid ParentId { get; }
    public int ParentProperty { get; set; }
    public List<ParentClass> ParentList { get; set; }

    public ParentClass() {
        this.ParentId = Guid.NewGuid();
    }
}

这很简单:它有一个ID,一些属性和一个包含自身元素的List。

现在我正在创建一个子类,如下所示:

public class ChildClass : ParentClass {
    public string ChildProperty { get; set; }

    public ChildClass() : base() {
        this.ParentList = new List<ChildClass>();
    }
}

这个有一个额外的属性和一个包含问题的构造函数。我无法在List的声明中发起List。 我不能只在子类中声明列表,因为我在使用它时需要它在父类中。

解决此问题的最佳方法是什么?

4 个答案:

答案 0 :(得分:5)

您应该使用指向两个类(ParentClass以及ChildClass)的接口。

具有特定类型参数的泛型类型是&#34; new&#34;类型:List<ChildClass>List<ParentClass>是不同的类型。

答案 1 :(得分:1)

我认为实现目标的最简单方法是使用其基本类型启动列表:List<ParentClass>

public class ChildClass : ParentClass
{
    public string ChildProperty { get; set; }

    public ChildClass() : base() {
        this.ParentList = new List<ParentClass>();
    }

    public void AddSomething()
    {
        // this is ok :
        this.ParentList.Add(new ChildClass());
    }
}

答案 2 :(得分:1)

仅当List<T>中的T类型具有协变性时,这种方法才有效,也称为“out T”。但是,它不是,也不可能。

  • 类型List<>允许AddInsert和其他类型,因此它不具有语义协变性。
  • 在C#中(截至当前),class类型无法变为协变。那是不支持的。只有interfacedelegate类型可以在其通用参数中变为协变(或逆变)。

我们得到的最接近的是IReadOnlyList<out T>,它是协变的,所以:

IReadOnlyList<ParentClass> parentList = new List<ChildClass>();

是允许的。但是,在您的情况下无效

答案 3 :(得分:0)

 public class ParentClass<TChild>  where TChild : class
    {
        public List<TChild> ParentList { get; set; }
        public Guid ParentId { get; set; }
        public int ParentProperty { get; set; }


        public ParentClass()
        {
            ParentId = Guid.NewGuid();
            ParentList = new List<TChild>();
        }
    }

    public class ChildClass : ParentClass<ChildClass>
    {
        public string ChildProperty { get; set; }

    }