这可能是我完全倒退的事情,但我想知道更多关于我做错的事情......
我已经声明一个类只不过是通用列表的直接继承(为简化命名而做),如下所示:
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,因为它们是同一个对象?
如果可以这样做,我该怎么做?
非常感谢!答案 0 :(得分:8)
您的问题是您使用了错误的工具来完成工作。 继承不是简化命名的机制;继承是一种主要设计用于(1)建模“是业务域对象类之间的一种”关系,以及(2)在相关类型之间实现实现细节的共享和专业化的机制。
如果您想简化命名,那么适合该工作的工具就是
using FooList = System.Collections.Generic.List<Foo>;
位于每个文件的顶部。
答案 1 :(得分:6)
他们不是一回事。 FooList
是List<foo>
,List<foo>
由FindAll()
继承自List<foo>
的{{1}}函数返回,不一个FooList
。您需要构建一个新的FooList
。
您可以为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
关键字创建一个别名。
答案 2 :(得分:1)
不要声明新的课程FooList
。只需使用别名。在源文件的顶部,写下:
using FooList = System.Collections.Generic.List<Foo>;
现在你可以在任何地方写FooList
,它将被视为与List<Foo>
完全相同。