如何优雅解决List<T>转换为其派生类ListOfT的问题
如何从List派生类中优雅返回自定义子类实例?
我从List<T>派生出ListOfT类,用来存放操作T类型列表的方法。我写了一个用Linq遍历列表并返回T类型子列表的GenerateSubList方法:
public class ListOfT : List<T> { //无显式构造函数 //其他操作该T类型列表的方法... public ListOfT GenerateSubList() { return this.Where(t => t.SomeCriteria).ToList(); // <- 编译器报错 return (ListOfT) this.Where(t => t.SomeCriteria).ToList(); // <- 编译通过但运行时出错 } }
编译器提示无法将List<T>转换为ListOfT,显然ToList()会生成新的List<T>实例,但我希望得到ListOfT实例。尝试显式转换虽能通过编译,但会引发运行时错误。请问是否有优雅的方式实现该转换(或替换ToList()调用)?
解决方案(参考@SomeBody的回答)
感谢各位的评论与解决方案,现将总结如下:
public class ListOfT : List<T> { //公共构造函数 public ListOfT() {} //从可枚举对象创建ListOfT的私有构造函数 private ListOfT(IEnumerable<T> subList) : base(subList) { } public ListOfT GenerateSubList() { //使用Linq创建枚举器并传入私有构造函数 return new ListOfT(this.Where(t => t.SomeCriteria)); } }
补充说明
- 或许我应该用
SomeClass代替T来明确ListOfT是使用SomeClass作为T的List<T>具体实例,而非模板类本身。 - 针对@Tim Schmelter的疑问:
t.SomeCriteria用于表示列表中每个T实例都有一个需验证的属性,符合条件才会被纳入子列表。关于“为何不从List继承”的讨论我已阅读,“拥有”与“是”的区别取决于个人选择和使用场景。 - 针对@Rookie的疑问:
GenerateSubList()返回的新列表不会包含原元素的副本,而是指向调用该方法的ListOfT实例中原始T对象的引用,这是预期行为。 - 针对@Oren Tamam和@Fildor的建议:我没有选择“拥有”而非“是”的实现方式,因为这需要实现
IList<T>接口。我个人认为继承List<T>的方式便于将特定类型列表的操作方法集中管理。 - 针对@Ralf的建议:扩展方法是增强特定类型列表的另一种方式,我曾在存在类层级且每个派生类都需被“列表化”的场景中使用过,这种情况下,包含扩展方法的静态类便于集中管理各类列表相关方法。
内容的提问来源于stack exchange,提问作者AstaDev
相关产品推荐
相关产品推荐

