.net 在C#中从枚举中获取字符串名称

at0kjp5o  于 2023-04-22  发布在  .NET
关注(0)|答案(3)|浏览(306)

我已经声明了枚举如下

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

从外部来源,我得到的状态值为1或2或3或4或5。
根据我得到的值,我需要查找这个枚举并得到它的字符串。
例如:如果输入值是1,我需要返回字符串形式的卡纳塔克邦。同样,如果输入值是5,我需要返回字符串形式的果阿。
有没有一个简单的方法来获得字符串,而不使用CASE或IFELSE。

w51jfk4q

w51jfk4q1#

您可以简单地使用nameofexpression来获取枚举的名称、枚举值、属性、方法、类名等。
使用nameof表达式的最快编译时解决方案。
返回枚举的文本。

public enum MyEnum {
    CSV,
    Excel
}

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

nuypyhwy2#

您可以像下面这样将Description标记添加到枚举中

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,然后你意识到你的古吉拉特语拼写错误,如果你改变了enum本身的文本,你需要通过整个代码来改变它(谢天谢地,visual studio使它更容易),而如果你使用Description作为标签来显示,你只需要改变它。
或者
当你在空间的名称(你必须显示)。
查谟和克什米尔是印度的另一个邦。
你可以有缩写(这里“JK”)在枚举名称和完整的字符串与空间的描述。

7gyucuyw

7gyucuyw3#

我知道这是一个老问题,但是你可以写一个特定于枚举的扩展类/方法来获取文本值。这是基于上面的方法,但是,它消除了围绕枚举 Package 的样板代码,并简化了获取这些名称所需的代码。
这种方法的好处是,您可以直接从enum值使用此扩展,就像使用nameof(MyEnum.Value1)一样,或者您可以在使用nameof(...)方法无法工作的对象的属性上使用它。
下面是扩展代码:

public static class EnumerationExtensions
    {
        public static string AsText<T>(this T value) where T : Enum
        {
            return Enum.GetName(typeof(T), value);
        }
    }

使用方法:

enum MyEnum {
  Value1,
  Value2,
}

class MyObject {
  MyEnum enumValue;
}

//Output directly from an Enum value
Console.WriteLine(MyEnum.Value1.AsText());  //Output: Value1

//Output from a property that is an enumeration
//NOTE: nameof(obj.enumValue) would not provide the desired value. but the AsText() method will give the name of the property value.
new obj = new MyObject { enumValue = MyEnum.Value2 };
Console.WriteLine(obj.enumValue.AsText());  //Output: Value2

相关问题