在子类子集合中更改泛型集合属性的元素

时间:2013-02-14 14:23:39

标签: c# generics inheritance collections

我有一个简单的接口ElementContainer(也是一个元素),它包含一个包含Elements的列表:

interface IElementContainer : IElement 
{
    List<Element> Elements { get; }
}

现在我有一个实现此接口的类:

class ConcreteContainer : IElementContainer
{
    List<IElement> Elements { get; private set; }
}

但是我不希望这个类成为所有Elements的容器,但只是它们的一部分,比如SpecificElement,但是这是不可能的(当然):

class SpecificElementContainer : IElementContainer
{
    List<SpecificElement> Elements { get; private set; }
}

因此我想到了类似的东西:

class SpecificElementContainer : IElementContainer
{
    List<IElement> Elements { get; private set; }
    List<SpecificElement> SpecificElements
    {
       get 
       {
          return return Elements.FindAll(el => el is T).Select<IElement, T>(el => (T)el).ToList<T>();
       }
 }

但是这样我就不能做这样的事情:SpecificContainer.SpecificElements.Add(...)因为它没有添加到Elements中。除此之外......这样做有点腥味。

任何线索如何以理智的方式对其进行重组?

在Jon Skeet的回答后编辑

阅读Jons评论我的问题实际上比我上面显示的要复杂一些,但我忘记了一些非常重要的信息。

当我有一个实现上述接口的类时,元素列表就像这样填充:

Elements = { ConcreteElementA, ConcreteElementA, ConcreteElementC, ConcreteElementB }

我想要的是我可以执行此操作ConcreteContainer.ConcreteElementCs.Add(new ConcreteElementC()),这会导致:

Elements = { ConcreteElementA, ConcreteElementA, ConcreteElementC, ConcreteElementB, ConcreteElementC }

其他修改

经过一番混淆后,我想将我的问题改写如下: 我有一个集合List<Element> OriginalCollection。我想创建一个子集合,其中包含实现Element,ConcreteElement,List<ConcreteElement> Subset的元素,并以OriginalCollection也被修改的方式添加到其中。

1 个答案:

答案 0 :(得分:1)

听起来你的ElementContainer界面应该是通用的:

interface ElementContainer<T> : Element where T : Element
{
    List<T> Elements { get; }
}

然后:

class SpecificElementContainer : ElementContainer<SpecificElement>
{
    List<SpecificElement> Elements { get; private set; }
}