【问题标题】:Get String Name from Enum in C#从 C# 中的枚举中获取字符串名称
【发布时间】:2018-10-30 05:29:04
【问题描述】:

我已将枚举声明如下

public enum State
    {
        KARNATAKA = 1,
        GUJRAT = 2,
        ASSAM = 3,
        MAHARASHTRA = 4,
        GOA = 5
    }

从外部来源,我得到的状态值是 1 或 2 或 3 或 4 或 5。

根据我得到的值,我需要查找这个枚举并获取它的字符串。

例如:如果输入值为 1,我需要将 KARNATAKA 作为字符串返回。同样,如果输入值为5,我需要将GOA作为字符串返回。

有没有不使用 CASE 或 IFELSE 的简单方法来获取字符串。

【问题讨论】:

  • 你的意思是像this
  • state.ToString() 考试:int i = 1; State st = (State)i; string name=st.ToString(); 姓名将得到 KARATAKA ?
  • @Aria 如果你的代码没有被混淆,是的,你会得到这样的。但这不是首选方式。 (如果你的代码要发布,代码混淆是个好方法)
  • @Amit,是的,但他没有谈论obfuscating,只是他想要的简单文本“如果输入值为1,我需要将KARNATAKA 作为字符串返回。”
  • 看看这个链接我想你问那个get string from enum

标签: c# .net enums


【解决方案1】:

您可以简单地使用nameof expression 来获取枚举的名称、枚举值、属性、方法、类名等。

使用 nameof 表达式的最快、编译时解决方案。

返回枚举的字面量。

public enum MyEnum {
    CSV,
    Excel
}

// calling code
string enumAsString = nameof(MyEnum.CSV) // enumAsString = "CSV"

【讨论】:

    【解决方案2】:

    您可以像下面这样将描述标签添加到您的枚举中

    public enum State
    {
        [Description("Karnataka")]
        KARNATAKA = 1,
        [Description("Gujarat")]
        GUJRAT = 2,
        [Description("Assam")]
        ASSAM = 3,
        [Description("Maharashtra")]
        MAHARASHTRA = 4,
        [Description("Goa")]
        GOA = 5
    }
    

    然后从枚举中获取分配的描述字符串,如下所示

    State stateVal = State.GOA;
    string stateName = GetEnumDescription(stateVal);
    

    如果您的状态与您提到的 cmets 一样,您仍然可以轻松地将其转换为枚举类型。

    int stateVal = 2;
    string stateName = GetEnumDescription((State)stateVal);   
    

    GetEnumDescription() 返回枚举名称的字符串。

    public static string GetEnumDescription(Enum enumVal)
    {
        System.Reflection.MemberInfo[] memInfo = enumVal.GetType().GetMember(enumVal.ToString());
        DescriptionAttribute attribute = CustomAttributeExtensions.GetCustomAttribute<DescriptionAttribute>(memInfo[0]);
        return attribute.Description;
    }
    

    注意

    由于对 enum 的操作比字符串操作成本更低,因此 enum 的字符串值应仅限于显示目的,而在内部您必须在逻辑中使用 enum 本身。

    获取 enum 的字符串值的方式更受欢迎。就好像您在代码中的很多地方都使用了枚举,并且您需要更改显示的文本,您只需要在一处更改文本。

    例如,

    假设你在整个项目中都使用了这个枚举,然后你意识到你的古吉拉特语拼写是错误的,如果你自己更改枚举的文本,你需要在整个代码中更改它(感谢 Visual Studio 让它变得更容易一些)而如果你使用描述作为标签来显示你只需要改变它。

    或者

    当您在名称中空格时(您必须显示)。

    EG。 “查谟和克什米尔”是印度的另一个州。

    您可以在枚举名称中使用缩写(此处为“JK”),并在描述中使用带有空格的完整字符串。

    【讨论】:

    • 如果你只想要一个属性,你应该使用GetCustomAttribute&lt;DescriptionAttribute&gt;(),它也会进行类型转换。此外,您应该使用Enum enumVal 将签名限制为枚举值,而不是object enumVal。此外,如果您将类型限制为State,为什么不直接写State enumVal。如果你想支持各种枚举,应该是Type type = enumVal.GetType();
    • @ckuri 感谢您指出这一点,我会在上电脑后更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 2017-08-01
    • 2010-12-07
    • 1970-01-01
    相关资源
    最近更新 更多