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

如何限制C#函数仅接收DifferenceType枚举的指定枚举值?

解决方案:限制枚举参数的有效值

针对你遇到的问题——无法修改全局使用的DifferenceType枚举,但需要确保函数仅接收Added和Removed两个有效值,以下是几种更严谨的实现方式:

1. 运行时校验+文档标注

在函数开头加入参数合法性校验,同时通过XML文档明确告知调用者允许的参数值,既保留枚举语义,又能在非法输入时快速报错。

/// <summary>
/// 执行特定操作,仅接受<DifferenceType.Added>或<DifferenceType.Removed>作为参数
/// </summary>
/// <param name="difference">操作类型,仅支持Added/Removed</param>
/// <exception cref="ArgumentException">当传入非法枚举值时抛出</exception>
public void DoSomething(DifferenceType difference)
{
    if (difference is not DifferenceType.Added and not DifferenceType.Removed)
    {
        throw new ArgumentException($"参数仅支持{DifferenceType.Added}或{DifferenceType.Removed}", nameof(difference));
    }

    if (difference == DifferenceType.Added)
    {
        // 执行Added逻辑
    }
    else
    {
        // 执行Removed逻辑
    }
}

2. 创建受限的包装类型

定义一个只包含合法值的包装结构体,通过私有构造函数和静态属性对外暴露允许的实例,强制调用者只能使用预设的合法值,完全避免非法输入的可能。

public readonly struct ValidDifferenceType
{
    public DifferenceType Value { get; }

    private ValidDifferenceType(DifferenceType value)
    {
        Value = value;
    }

    public static readonly ValidDifferenceType Added = new(DifferenceType.Added);
    public static readonly ValidDifferenceType Removed = new(DifferenceType.Removed);

    // 可选:支持从DifferenceType隐式转换,同时做校验
    public static implicit operator ValidDifferenceType(DifferenceType value)
    {
        if (value is not DifferenceType.Added and not DifferenceType.Removed)
        {
            throw new ArgumentException("仅支持Added或Removed类型", nameof(value));
        }
        return value == DifferenceType.Added ? Added : Removed;
    }
}

// 使用方式
public void DoSomething(ValidDifferenceType difference)
{
    if (difference.Value == DifferenceType.Added)
    {
        // 执行Added逻辑
    }
    else
    {
        // 执行Removed逻辑
    }
}

// 调用示例
DoSomething(ValidDifferenceType.Added);
// 或者通过隐式转换(会触发校验)
DoSomething(DifferenceType.Removed);

3. 拆分函数为独立方法

既然逻辑只针对Added和Removed两种场景,直接拆分为两个命名清晰的独立函数,完全消除参数歧义,调用者无需判断枚举值,代码可读性更强。

public void DoSomethingAdded()
{
    // 执行Added逻辑
}

public void DoSomethingRemoved()
{
    // 执行Removed逻辑
}

// 调用示例
DoSomethingAdded();
DoSomethingRemoved();

4. 使用C# 8+模式匹配增强

结合模式匹配简化逻辑,同时保留参数合法性校验:

public void DoSomething(DifferenceType difference)
{
    difference switch
    {
        DifferenceType.Added => // 执行Added逻辑,
        DifferenceType.Removed => // 执行Removed逻辑,
        _ => throw new ArgumentException($"非法参数值:{difference}", nameof(difference))
    };
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:40:14