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的价值,以便我回来"正在进行"?
答案 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
}