我希望在.NET中,枚举类型更加强大。但是我喜欢.NET!你可以使用属性来实现相同的功能。只需编写下面的代码一次,然后在任何地方使用它。这将是一个很长的答案,但我认为这是一个相当不错的解决方案,所以请耐心等待!
用法
SomeEnum e = SomeEnum.ValueTwo
string description = e.GetDescription()
枚举
使用属性来描述枚举及其取值。
[DescriptiveEnumEnforcement(DescriptiveEnumEnforcement.EnforcementTypeEnum.ThrowException)]
public enum SomeEnum
{
[Description("Value One")]
ValueOne,
[Description("Value Two")]
ValueTwo,
[Description("Value 3")]
ValueThree
}
DescriptionAttribute
[AttributeUsage(AttributeTargets.Field)]
public class DescriptionAttribute : System.Attribute
{
public string Description { get; set; }
public DescriptionAttribute() { }
public DescriptionAttribute(string description)
{
this.Description = description;
}
public override string ToString()
{
return this.Description;
}
}
描述性枚举强制属性
一个属性,用于确保您的枚举已正确配置。
[AttributeUsage(AttributeTargets.Enum)]
public class DescriptiveEnumEnforcementAttribute : System.Attribute
{
public enum EnforcementTypeEnum
{
ThrowException,
DefaultToValue
}
public EnforcementTypeEnum EnforcementType { get; set; }
public DescriptiveEnumEnforcementAttribute()
{
this.EnforcementType = EnforcementTypeEnum.DefaultToValue;
}
public DescriptiveEnumEnforcementAttribute(EnforcementTypeEnum enforcementType)
{
this.EnforcementType = enforcementType;
}
}
获取描述
public static partial class EnumUtil
{
public static string GetDescription(this Enum value)
{
return GetEnumDescription(value);
}
public static string GetDescription<T>(object value)
{
return GetEnumDescription(value);
}
public static string GetEnumDescription(object value)
{
if (value == null)
return null;
Type type = value.GetType();
if (!type.IsEnum)
throw new ApplicationException("Value parameter must be an enum.");
FieldInfo fieldInfo = type.GetField(value.ToString());
object[] descriptionAttributes = fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (descriptionAttributes == null || descriptionAttributes.Length == 0)
{
object[] enforcementAttributes = fieldInfo.GetCustomAttributes(typeof(DescriptiveEnumEnforcementAttribute), false);
if (enforcementAttributes != null && enforcementAttributes.Length == 1)
{
DescriptiveEnumEnforcementAttribute enforcementAttribute = (DescriptiveEnumEnforcementAttribute)enforcementAttributes[0];
if (enforcementAttribute.EnforcementType == DescriptiveEnumEnforcementAttribute.EnforcementTypeEnum.ThrowException)
throw new ApplicationException("No Description attributes exist in enforced enum of type '" + type.Name + "', value '" + value.ToString() + "'.");
return GetEnumName(value);
}
else
return GetEnumName(value);
}
else if (descriptionAttributes.Length > 1)
throw new ApplicationException("Too many Description attributes exist in enum of type '" + type.Name + "', value '" + value.ToString() + "'.");
return descriptionAttributes[0].ToString();
}
}