如何通过单个字符获取MVC中枚举的字符串值?
不用修改枚举数值的解决方案
我来给你几个靠谱的办法,完全不用改动现有枚举的整数值,不会影响你已经在运行的代码:
方法一:自定义特性+扩展方法(最规范的方式)
这种方式把字符和枚举的映射关系直接绑定在枚举成员上,结构清晰,扩展性也强。
首先定义一个用来存储对应字符的自定义特性:
public class SchoolCodeAttribute : Attribute { public char Code { get; } public SchoolCodeAttribute(char code) { Code = code; } }
然后给你的枚举成员加上这个特性(注意:只是加特性,完全不修改原有整数值):
public enum School { [SchoolCode('D')] DVB=1, [SchoolCode('A')] AVD=2, [SchoolCode('B')] ASB=3 }
接下来写一个扩展方法,用来根据字符找到对应的枚举并返回其名称:
public static class SchoolExtensions { public static string GetFullNameByCode(char code) { foreach (School school in Enum.GetValues(typeof(School))) { var attribute = school.GetType() .GetMember(school.ToString())[0] .GetCustomAttribute<SchoolCodeAttribute>(); if (attribute != null && attribute.Code == code) { return school.ToString(); } } throw new ArgumentException($"找不到对应代码 {code} 的学校"); } }
使用的时候直接调用就行:
char dbCode = 'D'; string fullSchoolName = SchoolExtensions.GetFullNameByCode(dbCode); // 结果是"DVB"
方法二:静态字典映射(简单直接)
如果不想搞特性这么复杂,直接建个静态字典来存字符和枚举的对应关系也很方便:
public static class SchoolMapping { private static readonly Dictionary<char, School> _codeToSchool = new() { {'D', School.DVB}, {'A', School.AVD}, {'B', School.ASB} }; public static string GetFullNameByCode(char code) { if (_codeToSchool.TryGetValue(code, out var school)) { return school.ToString(); } throw new ArgumentException($"找不到对应代码 {code} 的学校"); } }
调用方式和上面一样:
char dbCode = 'B'; string fullSchoolName = SchoolMapping.GetFullNameByCode(dbCode); // 结果是"ASB"
方法三:Switch-Case快速处理(适合枚举成员极少的情况)
如果你的枚举就这三个值,不想写额外的类,直接用switch-case也能快速解决问题:
public string GetSchoolFullName(char code) { return code switch { 'D' => School.DVB.ToString(), 'A' => School.AVD.ToString(), 'B' => School.ASB.ToString(), _ => throw new ArgumentException($"无效的学校代码:{code}") }; }
这种方法简单粗暴,但如果以后枚举加新成员,你得记得同步更新这个switch逻辑,扩展性不如前两种。
内容的提问来源于stack exchange,提问作者Dreamer
相关产品推荐
相关产品推荐

