C#如何检索修改后的枚举名称值

时间:2017-04-13 20:24:04

标签: c# attributes

我有一个真正的爆炸式API,其中返回值使用了遍布各处的命名约定... 从骆驼案到Pascal案到大写字母到字符串有空格......这太乱了......

因此,为了序列化或反序列化它,使用json.net很简单,添加一个jsonSerializer或添加一个带有json属性属性的类,如下所示:

[JsonProperty(PropertyName = "somebanged upName")]
public string[] SomethingBangedUp;

我还想在将一些值硬件化为枚举时做类似的事情,然后获取'撞击名称'而不是变量名称的列表:

public enum SomeBangedUpEnum
{
    [EnumMember(Value = "someThingelse BangedUp")]
    SomethingElseBangedUp,
}

var v = Enum.GetNames(typeof(SomeBangedUpEnum)).ToList();

但是这会像我希望的那样,恢复变量名“SomethingElseBangedUp”而不是“someThingelse BangedUp”;

知道怎样才能获得EnumMember属性设置的爆炸值?

1 个答案:

答案 0 :(得分:1)

属性是元数据。如果要读取元数据,则应使用反射。您可以使用GetCustomAttribute扩展名从类型成员中读取属性值。例如。如果你想得到枚举成员的所有名字:

var v = typeof(SomeBangedUpEnum)
   .GetFields(BindingFlags.Public|BindingFlags.Static)
   .Select(f => f.GetCustomAttribute<EnumMemberAttribute>()?.Value)
   .ToList();

或者,如果您想获得某个特定枚举成员的名称,那么您可以只获取特定字段,而不是获取所有字段:

var name = typeof(SomeBangedUpEnum)
    .GetField(SomeBangedUpEnum.SomethingElseBangedUp.ToString())
    .GetCustomAttribute<EnumMemberAttribute>()?.Value;