4

这可能是我完全记错了,但我想知道更多关于我做错了什么......

我已经声明一个类只不过是从泛型列表的直接继承(这样做是为了简化命名),如下所示:

public class FooList : List<Foo> {}

现在在另一个与此类完全分开的方法中,我试图返回此类的一个实例,但是我想根据标准过滤该类,所以我使用的是 lambda 表达式:

var list = new FooList(); // imagine this fills it with different items
var filtered = list.FindAll(c => c.Something == "filter criteria");

现在根据 FindAll 方法,这应该返回一个 List[Foo]。但是,我想将此对象返回为 FooList,而不是 List[Foo]。我是否必须创建 FooList 的新实例并从 List[Foo] 中复制项目?

如果是这样,为什么?为什么我不能直接将 List 转换为 FooList,因为它们是同一个对象?

如果可以做到这一点,我该怎么做?

非常感谢!

4

3 回答 3

8

您的问题是您使用了错误的工具来完成这项工作。继承不是简化命名的机制;继承是一种机制,主要用于 (1) 对业务领域对象类之间的“是一种”关系建模,以及 (2) 在相关类型之间实现实现细节的共享和专业化。

如果你想简化命名,那么正确的工具就是把

using FooList = System.Collections.Generic.List<Foo>;

在每个文件的顶部。

于 2010-09-15T21:49:15.477 回答
6

它们不是同一件事。AFooList是 aList<foo>但 a由继承自List<foo>的函数返回,它不是a 。您将需要构建一个新的.FindAll()List<foo>FooListFooList

您可以执行类似创建构造函数的操作,该构造函数FooList采用IEnumerable<foo>如下对象:

class FooList : List<foo>
{
   public FooList(IEnumerable<foo> l)
        : base(l)
   {  }
}

或者你也可以这样做:

 var list = new FooList();
 var filtered = list.FindAll(c => c.Something == "filter criteria");
 var newList = new FooList();
 newList.AddRange(filtered);
 return newList;

但是,正如其他一些答案中提到的那样,如果您不添加任何功能,那么您应该只使用using关键字创建一个别名。

于 2010-09-15T21:41:24.703 回答
1

不要声明一个新的类FooList。只需使用别名。在源文件的顶部,写入:

using FooList = System.Collections.Generic.List<Foo>;

现在你可以FooList在任何地方写,它将被视为与List<Foo>.

于 2010-09-15T21:50:22.700 回答