如何读取EnumMember属性的值

时间:2014-12-09 06:36:44

标签: 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
}

我如何阅读Status.InProgress的价值,以便我回来"正在进行"?

9 个答案:

答案 0 :(得分:14)

这样的事情:

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;
}

用法:

var enumType = typeof(Status);
var enumVal = Status.InProgress;
var str = GetEnumMemberAttrValue(enumType,enumVal);

答案 1 :(得分:7)

借用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;
}

用法如下:

var enumVal = Status.InProgress;
var str = GetEnumMemberAttrValue(enumVal);

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

答案 2 :(得分:6)

我已经针对.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;
}

答案 3 :(得分:2)

如果您的项目中有 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
}

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

dbValue == JsonConvert.SerializeObject(Status.InProgress).Replace("\"","");

答案 4 :(得分:1)

将其包装在扩展程序中以使其更自然:

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;
    }
}

用法:

string dbValue = "In Progress";
if (dbValue == Status.ToEnumMemberAttrValue())){
    //do some thing
}

答案 5 :(得分:1)

尝试一下,

var type = typeof(YourEnum);
var Info = type.GetMember(YourEnum.attribute); // pass enum item here
string enumdescription = Info[0].CustomAttributes.SingleOrDefault().NamedArguments[0].TypedValue.ToString();

答案 6 :(得分:1)

    public static object GetMemberAttr(this Enum enumItem)
    {
        var memInfo = enumItem.GetType().GetMember(enumItem.ToString());
        var attr = memInfo[0].GetCustomAttributes(false);
        return attr == null || attr.Length == 0 ? null :((System.Runtime.Serialization.EnumMemberAttribute) attr[0]).Value;
    }

用法:{YouEnum}。{EnumItem} .GetMemberAttr() 公共枚举TEST_ENUM { [EnumMember(Value =“ 1min”)] 分钟, [EnumMember(Value =“ 2min”)] 2分钟, [EnumMember(Value =“ 3min”)] 三分钟, }

公开TEST_ENUM t;

? t.TwoMinutes.GetMemberAttr()
2分钟

答案 7 :(得分:0)

Status.InProgress.GetStringValue()

如果您有Elasticsearch.Net库,则可以使用它,但是如果您恰巧没有使用ES,那么这里的其他解决方案可能会更好。

答案 8 :(得分:0)

[EnumMember] 属性由 Newtonsoft 等序列化程序使用。

System.Runtime.Serialization(命名空间)

EnumMemberAttribute(类)

枚举:

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

示例代码:

string databaseValue = "In Progress";

// Serialize the enum value
string statusValue = Newtonsoft.Json.JsonConvert.SerializeObject(Status.InProgress);

if  (statusValue.Contains(databaseValue))
{
    // Do something
}