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

如何通过单个字符获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:39:51