如何读取EnumMember属性的值

use*_*997 10 c# attributes

public enum Status
    {

        Pending,
        [EnumMember(Value = "In Progress")]
        InProgress,
        Failed,
        Success
    }

string dbValue = "In Progress";
if (dbValue == ValueOf(Status.InProgress)){
//do some thing
}
Run Code Online (Sandbox Code Playgroud)

我怎么读Status.InProgress的价值所以我回来了"进行中"?

Ami*_*ich 15

像这样的东西:

public string GetEnumMemberAttrValue(Type enumType, object enumVal)
{
      var memInfo = enumType.GetMember(enumVal.ToString());
      var attr = memInfo[0].GetCustomAttributes(false).OfType<EnumMemberAttribute>().FirstOrDefault();
      if(attr != null)
      {
          return attr.Value;
      }

      return null;
}
Run Code Online (Sandbox Code Playgroud)

用法:

var enumType = typeof(Status);
var enumVal = Status.InProgress;
var str = GetEnumMemberAttrValue(enumType,enumVal);
Run Code Online (Sandbox Code Playgroud)


Wes*_*Wes 8

借用Amir的答案,使用泛型可以获得更好的版本,如下所示:

public string GetEnumMemberAttrValue<T>(T enumVal)
{
    var enumType = typeof(T);
    var memInfo = enumType.GetMember(enumVal.ToString());
    var attr = memInfo.FirstOrDefault()?.GetCustomAttributes(false).OfType<EnumMemberAttribute>().FirstOrDefault();
    if (attr != null)
    {
        return attr.Value;
    }

    return null;
}
Run Code Online (Sandbox Code Playgroud)

用法如下:

var enumVal = Status.InProgress;
var str = GetEnumMemberAttrValue(enumVal);
Run Code Online (Sandbox Code Playgroud)

据我所知,T不能使用where子句约束枚举.我很高兴能够得到纠正.

  • 您可以从c#7.3开始:https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-7-3#enhanced-generic-constraints (2认同)

Chr*_*aws 8

我已经为.NET Core改编了这个.这里是:

public static String GetEnumMemberValue<T>(T value)
    where T : struct, IConvertible
{
    return typeof(T)
        .GetTypeInfo()
        .DeclaredMembers
        .SingleOrDefault(x => x.Name == value.ToString())
        ?.GetCustomAttribute<EnumMemberAttribute>(false)
        ?.Value;
}
Run Code Online (Sandbox Code Playgroud)


dub*_*ubi 8

如果您的项目中有 Newtonsoft,那么您应该这样做:

到枚举中,您应该添加属性 [JsonConverter(typeof(StringEnumConverter))]

现在您可以调用 JsonConvertor 将您的值序列化为成员字符串值。

在你的例子中,应该是这样的

[JsonConverter(typeof(StringEnumConverter))]
public enum Status
{

    Pending,
    [EnumMember(Value = "In Progress")]
    InProgress,
    Failed,
    Success
}

string dbValue = "In Progress";
if (dbValue == JsonConvert.SerializeObject(Status.InProgress)){
//do some thing
}
Run Code Online (Sandbox Code Playgroud)

请注意,正如 @Dinesh 在评论中提到的,该字符串是 JSON,因此使用 quatos 返回,因此您可以解决该问题,以使用 strin.Replace 方法获取干净的字符串,如下所示:

dbValue == JsonConvert.SerializeObject(Status.InProgress).Replace("\"","");
Run Code Online (Sandbox Code Playgroud)

  • JsonConvert SerializeObject 返回带双引号的枚举字符串,您对这个问题有什么解决方案吗? (2认同)

小智 7

把它包裹在一个扩展中,让它感觉更自然:

public static class Extension
{
    public static string ToEnumMemberAttrValue(this Enum @enum)
    {
        var attr = 
            @enum.GetType().GetMember(@enum.ToString()).FirstOrDefault()?.
                GetCustomAttributes(false).OfType<EnumMemberAttribute>().
                FirstOrDefault();
        if (attr == null)
            return @enum.ToString();
        return attr.Value;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

string dbValue = "In Progress";
if (dbValue == Status.ToEnumMemberAttrValue())){
    //do some thing
}
Run Code Online (Sandbox Code Playgroud)