当然,您可以使用DisplayAttribute 来注释您的Enums。
enum OrderStatus
{
[Display(Description="Long Desc", Name="Awaiting Authorization", ShortName="Wait Auth")]
AwaitingAuthorization,
[Display(Description="...", Name="...", ShortName="...")]
InProduction,
[Display(Description="...", Name="...", ShortName="...")]
AwaitingDespatch
}
您还可以选择创建一个扩展方法,获取任何枚举值并根据为其设置的属性返回其显示名称,以整理 UI 中显示的值,如下所示:
public static class EnumExtensions
{
public static string ToName(this Enum enumValue)
{
var displayAttribute = enumValue.GetType()
.GetMember(enumValue.ToString())[0]
.GetCustomAttributes(false)
.Select(a => a as DisplayAttribute)
.FirstOrDefault();
return displayAttribute?.Name ?? enumValue.ToString();
}
}
有
public enum Test
{
[Display(Name="AAA")]
a,
b
}
代码:
Console.WriteLine(Test.a.ToName());
Console.WriteLine(Test.b.ToName());
结果
AAA
b
我想使用扩展方法将我的枚举绑定到 SelectList:
为了类型安全,我不会使用扩展方法,而是使用处理 Enum 类型的静态类:
C# 7.3 之前的版本。由于Enum 在 7.3 之前不是有效的类型约束(并且会导致编译时异常),因此您最终会认为枚举是值类型并且它们实现了一些接口,以限制类型参数尽可能接近Enum。
public static class Enums<TEnum> where TEnum : struct, IComparable, IFormattable, IConvertible
{
static Enums()
{
if (!typeof(TEnum).IsEnum)
{
throw new InvalidOperationException();
}
}
}
C# 7.3+ 版本,编译时检查...耶!
public static class Enums<TEnum> where TEnum : Enum
{
}
类的GetValues方法:
public static IEnumerable<TEnum> GetValues(bool includeFirst)
{
var result = ((TEnum[])Enum.GetValues(typeof(TEnum))).ToList();
if (!includeZero)
result = result.Where(r => r != default).ToList();
return result;
}
如果您关注Enum Guidelines 并包含默认(零)值,我们可以忽略它(有时我们希望显示“未选择”之类的值,有时我们不显示“无效选择”)。
然后我们可以添加另一个方法:
public static IEnumerable<string> GetNames(bool includeFirst)
{
var result = GetValue(includeFirst)
.Select(v => v.ToName())
.ToList();
return result;
}