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

C#如何指定一组类型作为泛型类型约束?

泛型记录类Parameter的类型约束实现方案

C#原生泛型约束语法不支持直接指定多个无关联类型的联合限制,因此需要通过以下几种方案来实现需求:

一、编译时强制约束(推荐)

通过封装实例创建逻辑,对外提供针对允许类型的静态创建方法,隐藏泛型的直接实例化能力,从根源上在编译阶段阻止非法类型的使用:

public record Parameter<T>(string Name, T Value)
{
    // 私有构造函数,仅允许内部静态方法创建实例
    private Parameter(string name, T value) : this(name, value) { }

    // 为每种允许的类型提供公开的创建入口
    public static Parameter<int> CreateInt(string name, int value) => new(name, value);
    public static Parameter<double> CreateDouble(string name, double value) => new(name, value);
    public static Parameter<string> CreateString(string name, string value) => new(name, value);
    public static Parameter<bool> CreateBool(string name, bool value) => new(name, value);
    public static Parameter<DateOnly> CreateDateOnly(string name, DateOnly value) => new(name, value);
}

用户无法直接通过new Parameter<OtherType>(...)创建非法类型的实例,只能通过上述静态方法创建符合要求的Parameter对象。

二、运行时约束(补充方案)

如果需要保留泛型的直接实例化能力,可以在泛型类型的静态构造函数中添加类型检查,在运行时拦截非法类型:

public record Parameter<T>(string Name, T Value)
{
    static Parameter()
    {
        var allowedTypes = new HashSet<Type>
        {
            typeof(int), typeof(double), typeof(string), typeof(bool), typeof(DateOnly)
        };

        if (!allowedTypes.Contains(typeof(T)))
        {
            throw new InvalidOperationException($"类型 {typeof(T).Name} 不允许作为Parameter的泛型参数");
        }
    }
}

这种方式无法在编译阶段阻止非法类型,但会在第一次使用非法泛型类型时抛出运行时异常,起到事后校验的作用。

三、自定义代码分析器(进阶方案)

可以编写Roslyn自定义分析器,在编译阶段检测泛型参数T是否属于指定的类型集合,一旦发现非法类型就直接抛出编译错误。这种方式既保留泛型的直接使用语法,又能实现编译时约束,但需要额外开发分析器并集成到项目中。

内容的提问来源于stack exchange,提问作者acmoune

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 05:52:07