C#如何实现基于子串匹配的枚举值查找功能
C# 支持子串匹配的枚举解析实现方案
- 优先保留原生
Enum.TryParse的逻辑,保证原有精确匹配(含忽略大小写)的能力不变 - 精确匹配失败后,遍历枚举所有字段名,使用子串匹配逻辑校验,支持忽略大小写
- 封装为通用泛型扩展方法,可适配所有枚举类型,用法和原生
TryParse保持一致
通用扩展方法实现
using System; public static class EnumExtensions { /// <summary> /// 尝试解析枚举,支持子串匹配 /// </summary> /// <typeparam name="TEnum">枚举类型</typeparam> /// <param name="input">输入字符串</param> /// <param name="ignoreCase">是否忽略大小写</param> /// <param name="result">输出枚举结果</param> /// <returns>是否匹配成功</returns> public static bool TryParseContain<TEnum>(string input, bool ignoreCase, out TEnum result) where TEnum : struct, Enum { result = default; // 先走原生精确匹配逻辑 if (Enum.TryParse(input, ignoreCase, out result)) { return true; } // 精确匹配失败走子串匹配 var comparison = ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal; foreach (var enumName in Enum.GetNames<TEnum>()) { if (enumName.Contains(input, comparison)) { result = Enum.Parse<TEnum>(enumName); return true; } } // 无匹配返回失败 return false; } }
如果项目使用的C#版本低于7.3,不支持枚举类型约束,可将泛型约束改为
where TEnum : struct,并在方法开头添加校验逻辑if (!typeof(TEnum).IsEnum) throw new ArgumentException("TEnum 必须是枚举类型");即可兼容。
示例改造代码
public static void Main() { string a = "HANS"; GetName(a); // 输出Hans string a1 = "Peter"; GetName(a1); // 输出WolfgangPeterDietrich } public enum MyNames { Hans = 0, WolfgangPeterDietrich = 3, } public static void GetName(string a) { if (EnumExtensions.TryParseContain<MyNames>(a, true, out var dif)) { Console.WriteLine(dif.ToString()); } else { Console.WriteLine("无匹配枚举值"); } }
多匹配场景适配
如果存在多个枚举名称包含目标子串的场景,可按业务需求调整匹配规则:
- 取第一个匹配值:保持现有逻辑即可
- 取最短/最匹配值:将所有匹配结果收集后按字符串长度排序后返回
- 避免歧义:多个匹配时抛出
AmbiguousMatchException明确提示冲突
内容的提问来源于stack exchange,提问作者KevinNivek
相关产品推荐
相关产品推荐

