我的枚举包含以下值:
private enum PublishStatusses{
NotCompleted,
Completed,
Error
};
我希望能以用户友好的方式输出这些值。
但我不需要再将字符串转换回值。
只需使用一个模拟枚举的静态类:
public static class PublishStatusses{
public const string NotCompleted = "Not Completed";
public const string Completed = "Completed";
public const string Error = "Error"
};
要访问这些值,只需像使用枚举一样使用:
PublishStatusses.NotCompleted;
string res = Regex.Replace(PublishStatusses.NotCompleted, "[A-Z]", " $0").Trim();
default
子句中这样做,但我仍然不建议。 - undefinedpublic static string ToEnumString<T>(this T input) where T : Enum
{
return Enum.GetName(typeof(T),input);
}
使用方法:
public enum CommentInformType { Abuse, Misleading, Spam, BadMouth }
...
CommentInformType _informType = CommentInformType.Spam;
_informType.ToEnumString();
对于包含标志的枚举。
public static string Description(this Enum value)
{
Type type = value.GetType();
List<string> res = new List<string>();
var arrValue = value.ToString().Split(',').Select(v=>v.Trim());
foreach (string strValue in arrValue)
{
MemberInfo[] memberInfo = type.GetMember(strValue);
if (memberInfo != null && memberInfo.Length > 0)
{
object[] attrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attrs != null && attrs.Length > 0 && attrs.Where(t => t.GetType() == typeof(DescriptionAttribute)).FirstOrDefault() != null)
{
res.Add(((DescriptionAttribute)attrs.Where(t => t.GetType() == typeof(DescriptionAttribute)).FirstOrDefault()).Description);
}
else
res.Add(strValue);
}
else
res.Add(strValue);
}
return res.Aggregate((s,v)=>s+", "+v);
}
我使用一个通用类来存储枚举/描述对,以及一个嵌套的辅助类来获取描述。
枚举:
enum Status { Success, Fail, Pending }
泛型类:
注意:由于泛型类不能受到枚举的限制,我将其限制为结构体,并在构造函数中检查枚举。
public class EnumX<T> where T : struct
{
public T Code { get; set; }
public string Description { get; set; }
public EnumX(T code, string desc)
{
if (!typeof(T).IsEnum) throw new NotImplementedException();
Code = code;
Description = desc;
}
public class Helper
{
private List<EnumX<T>> codes;
public Helper(List<EnumX<T>> codes)
{
this.codes = codes;
}
public string GetDescription(T code)
{
EnumX<T> e = codes.Where(c => c.Code.Equals(code)).FirstOrDefault();
return e is null ? "Undefined" : e.Description;
}
}
}
使用方法:
EnumX<Status>.Helper StatusCodes = new EnumX<Status>.Helper(new List<EnumX<Status>>()
{
new EnumX<Status>(Status.Success,"Operation was successful"),
new EnumX<Status>(Status.Fail,"Operation failed"),
new EnumX<Status>(Status.Pending,"Operation not complete. Please wait...")
});
Console.WriteLine(StatusCodes.GetDescription(Status.Pending));
我认为解决您的问题最好(也是最简单)的方法是为您的枚举编写一个扩展方法:
public static string GetUserFriendlyString(this PublishStatusses status)
{
}
如果您想要完全可定制的东西,请尝试我的解决方案:
http://www.kevinwilliampang.com/post/Mapping-Enums-To-Strings-and-Strings-to-Enums-in-NET.aspx
基本上,这篇文章概述了如何将描述属性附加到每个枚举中,并提供了一种通用的从枚举到描述的映射方式。