C#中能否实现支持无限层级的通用泛型类构建层级列表?
首先直接给结论:你当前的代码不可行,问题出在BasicOverviewModel<new T>这个语法上——C#里根本没有new T这种泛型参数写法,这会直接编译报错。不过你的核心需求(构建支持无限层级的泛型集合)是完全可以实现的,只是写法需要调整。
问题出在哪?
你写的ChildOverviewModelCollection用了BasicOverviewModel<new T>,这是错误的语法。这里的泛型参数要么和外层的T保持一致,要么如果需要子节点支持不同类型,就得新增泛型参数,但如果是要实现无限层级的同结构模型,其实只需要让子节点的泛型类型和父节点相同就行。
正确的实现方案
如果你的需求是同一个泛型类型的无限层级嵌套(比如每个节点的OverViewModel都是T类型,子节点也是BasicOverviewModel<T>),那么正确的写法应该是这样:
public class BasicOverviewModel<T> { public T OverViewModel { get; set; } // 子节点集合的泛型参数就是当前的BasicOverviewModel<T>,不需要new T public IEnumerable<BasicOverviewModel<T>> ChildOverviewModelCollection { get; set; } }
这样设计的话,每个节点既包含一个T类型的实体,又包含一组同类型的子节点,完美支持无限层级的结构。
扩展:如果子节点需要不同的泛型类型?
如果你的场景中,子节点的OverViewModel类型可能和父节点不同(比如父节点是Product,子节点是ProductDetail),那可以新增第二个泛型参数:
public class HierarchicalModel<TParent, TChild> { public TParent ParentItem { get; set; } public IEnumerable<HierarchicalModel<TChild, TChild>> ChildItems { get; set; } }
不过这种场景相对少见,大部分层级列表(比如菜单、分类树)都是同类型节点嵌套,所以第一种方案更通用。
使用示例
比如我们要构建一个分类树,Category类如下:
public class Category { public int Id { get; set; } public string Name { get; set; } }
然后创建层级结构:
var rootCategory = new BasicOverviewModel<Category> { OverViewModel = new Category { Id = 1, Name = "电子产品" }, ChildOverviewModelCollection = new List<BasicOverviewModel<Category>> { new BasicOverviewModel<Category> { OverViewModel = new Category { Id = 2, Name = "手机" }, ChildOverviewModelCollection = new List<BasicOverviewModel<Category>> { new BasicOverviewModel<Category> { OverViewModel = new Category { Id = 3, Name = "智能手机" } } } }, new BasicOverviewModel<Category> { OverViewModel = new Category { Id = 4, Name = "电脑" } } } };
这样就构建了一个三层的分类树,完全满足无限层级的需求。
总结
你的核心思路是对的,只是犯了一个语法错误。调整子节点集合的泛型参数为BasicOverviewModel<T>后,就能实现你想要的通用无限层级泛型类型了。
内容的提问来源于stack exchange,提问作者Roman Borovets

