C# 从C中的枚举中获取字符串名称

C# 从C中的枚举中获取字符串名称,c#,.net,enums,C#,.net,Enums,我已声明enum如下 public enum State { KARNATAKA = 1, GUJRAT = 2, ASSAM = 3, MAHARASHTRA = 4, GOA = 5 } 从外部来源,我得到的状态值为1或2或3或4或5 根据我得到的值,我需要查找这个枚举并得到它的字符串 例如:如果输入值是1,我需要将卡纳塔克邦作为字符串返回。类似地,如果输入值为5,则需要将GOA作为字符串返回

我已声明enum如下

public enum State
    {
        KARNATAKA = 1,
        GUJRAT = 2,
        ASSAM = 3,
        MAHARASHTRA = 4,
        GOA = 5
    }
从外部来源,我得到的状态值为1或2或3或4或5

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

例如:如果输入值是1,我需要将卡纳塔克邦作为字符串返回。类似地,如果输入值为5,则需要将GOA作为字符串返回


有没有一种简单的方法可以在不使用usecase或IFELSE的情况下获取字符串。

您可以向枚举添加描述标记,如下所示

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);
然后从枚举中获得指定的描述字符串,如下所示

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);
如果您的状态和前面提到的注释一样多,您仍然可以轻松地将其转换为枚举类型

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,并且需要更改显示的文本一样,您将只需要更改一个位置的文本

比如说,

假设您在整个项目中都使用了这个枚举,然后您意识到古吉拉特邦的拼写是错误的,如果您自己更改枚举的文本,您需要通过整个代码来更改它,谢天谢地,visual studio使它变得简单了一点,而如果您使用描述作为标签来显示,您只需要更改它

当您在名称中输入空格时,必须显示该空格

查谟和克什米尔是印度的另一个州

您可以在enum名称中使用缩写JK,在描述中使用空格完成字符串

您只需使用nameof获取枚举的名称、枚举值、属性、方法、类名等

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

返回枚举的文本

public enum MyEnum {
    CSV,
    Excel
}

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

你的意思是像?state.ToString for exam:inti=1;状态st=状态I;字符串名称=st.ToString;name会得到KARATAKA?@Aria如果你的代码没有被混淆,是的,你会得到这样的结果。但这不是首选的方式。而且,如果您的代码即将发布,代码混淆是一种很好的解决方法go@Amit,是的,但他没有提到模糊处理,如果输入值为1,我需要将卡纳塔克邦返回为字符串。看这个链接,我想你要求如果你只需要一个属性,就应该使用GetCustomAttribute,它也做打字。此外,还应使用枚举枚举值将签名限制为枚举值,而不是对象枚举值。另外,如果您将类型限制为State,为什么不直接编写State enumVal呢。如果要支持所有类型的枚举,则应为Type=enumVal.GetType@谢谢你指出这一点,一旦我上了电脑,我会更新的。