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

如何限制方法参数仅允许传入特定字符串值(如High/Medium/Low)?

限制C#方法字符串参数的几种实用方案

针对你想限制Foo方法只能接收High/Medium/Low这三个字符串参数的需求,这里有几种靠谱的实现方式:

1. 用枚举(最推荐,类型安全)

这是最直接的方式,编译阶段就能拦截非法值,完全杜绝随意传字符串的问题:
首先定义枚举类型:

public enum RangeLevel
{
    High,
    Medium,
    Low
}

然后修改方法的参数类型:

public void Foo(RangeLevel range)
{
    // 如果业务需要字符串,直接调用 range.ToString() 转换即可
}

调用的时候只能传枚举成员,比如Foo(RangeLevel.High),其他值根本过不了编译。

2. 保留字符串参数,加运行时校验

如果必须保留string类型的参数,可以在方法内部做校验,非法值直接抛异常:

public void Foo(string range)
{
    if (range is not "High" and not "Medium" and not "Low")
    {
        throw new ArgumentOutOfRangeException(nameof(range), "参数只能是 High、Medium 或 Low");
    }
    // 执行后续业务逻辑
}

这种方式是运行时检查,虽然编译时没法阻止错误输入,但能在代码运行第一时间发现问题。

3. 静态类定义常量+校验

先把允许的字符串定义成常量,调用时用常量减少拼写错误,同时方法内做校验:

public static class RangeConstants
{
    public const string High = "High";
    public const string Medium = "Medium";
    public const string Low = "Low";
}

public void Foo(string range)
{
    if (range != RangeConstants.High && range != RangeConstants.Medium && range != RangeConstants.Low)
    {
        throw new ArgumentOutOfRangeException(nameof(range));
    }
}

调用时用Foo(RangeConstants.High),能降低手动输错的概率,但还是没法在编译阶段完全限制。

4. C# 9+ 封闭记录类型(灵活且类型安全)

如果需要更灵活的封装,同时保持类型安全,可以用封闭的记录类型:

public abstract record Range;
public sealed record HighRange : Range;
public sealed record MediumRange : Range;
public sealed record LowRange : Range;

public void Foo(Range range)
{
    var rangeStr = range switch
    {
        HighRange => "High",
        MediumRange => "Medium",
        LowRange => "Low",
        _ => throw new ArgumentOutOfRangeException(nameof(range))
    };
    // 后续逻辑
}

调用时传new HighRange(),编译阶段就能限制只能传这三种记录类型,同时可以在内部转换成需要的字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:45:42