如何限制方法参数仅允许传入特定字符串值(如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
相关产品推荐
相关产品推荐

