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)
借用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子句约束枚举.我很高兴能够得到纠正.
我已经为.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)
如果您的项目中有 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)
小智 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)
| 归档时间: |
|
| 查看次数: |
11249 次 |
| 最近记录: |