如何简化C# FlatTree泛型声明 无需手动传入Flattenable关联泛型参数
解决方案
C# 泛型类的构造函数不支持泛型参数自动推断,也不支持部分泛型参数指定(要么全部显式声明,要么全部由编译器推断),所以无法直接通过原生构造函数实现你期望的调用写法,我们可以通过静态工厂方法来实现效果完全一致的简化调用,不需要修改原有业务类的代码。
修改步骤
1. 新增非泛型静态工厂类
原有Flattenable抽象类、MyObjectClass实现类、三泛型FlatTree类的代码完全不需要改动,只需要新增一个同名的非泛型静态FlatTree类,作为创建实例的统一入口:
public static class FlatTree { // 利用方法的泛型参数推断能力,自动从入参提取所有泛型类型 public static FlatTree<T, T_Id, T_Order> Create<T, T_Id, T_Order>(IEnumerable<T> list) where T : Flattenable<T_Id, T_Order> where T_Id : struct, IComparable where T_Order : IComparable { return new FlatTree<T, T_Id, T_Order>(list); } }
2. 简化调用示例
List<MyObjectClass> myList = GetItems(); // 原有写法,需要显式写全3个泛型参数 var temp1 = new FlatTree<MyObjectClass, int, int>(myList); // 简化写法1:完全自动推断所有泛型参数,等价于你期望的new FlatTree(myList) var temp2 = FlatTree.Create(myList); // 简化写法2:如果需要显式指定实体类型,直接补全泛型参数即可 var temp3 = FlatTree.Create<MyObjectClass, int, int>(myList);
可选补充方案
如果你需要更贴近new FlatTree<MyObjectClass>(myList)的写法,可以在使用的文件头部声明C#类型别名:
// 替换为你实际的命名空间 using FlatTree<T> = YourNamespace.FlatTree<T, int, int>;
声明后即可在当前文件直接使用var temp = new FlatTree<MyObjectClass>(myList);的写法,缺点是别名仅对当前文件生效,且仅适配固定的T_Id、T_Order类型。
内容的提问来源于stack exchange,提问作者Drag and Drop
相关产品推荐
相关产品推荐

