从抽象引用列表生成具体对象列表

时间:2012-03-05 15:37:42

标签: c#

我的容器对象包含一个私有的List<AbstractBaseClass>和几个从AbstractBaseClass派生的具体类型的公共列表。通过Add(AbstractBaseClass ABC)方法引用AbstractBaseClass将对象添加到容器类中。

公共列表是根据请求的Linq查询生成的

public List<ConcreteClass> ConcreteList
{
    get
    {
        return
            from a in _abc
            Where a is ConcreteClass
            select(a as ConcreteClass)
     }
}

这是一种可接受的方法吗?对象是否在这里被抛入ConcreteClass两次并且效率低下。

2 个答案:

答案 0 :(得分:4)

你正在重新发明BCL已经提供的轮子。使用OfType<T>过滤混合列表以查找给定具体类型的项目。

var concretes = _abc.OfType<ConcreteClass>().ToList();

答案 1 :(得分:0)

我建议:

public IEnumerable<ConcreteClass> ConcreteList 
{ 
    get 
    { 
        foreach (a in _abc) 
        {
          ConcreteClass c = a as ConcreteClass;
          if (c != null)
            yield return c;
        }
     } 
} 

你避免使用双重转换,我认为最好返回IEnumerable而不是List,这样调用者就不会认为可以修改返回的值。