You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:15:05