键值对作为枚举

我可以使用枚举作为键值对。

public enum infringementCategory { Infringement, OFN } 

如果我选择Infringement我应该得到“INF0001”,如果我选择OFN我应该得到“INF0002”

可能吗?

您可以使用装饰器将字符串表示与枚举值相关联。 检查此问题: 使用用户友好的字符串枚举ToString

它看起来像:

 public enum infringementCategory { [Description("INF0001")] Infringement, [Description("INF0002")] OFN } 

看起来比使用Dictionary更整洁,需要更少的维护。

这些扩展怎么样:

 public static class EnumExtension { ///  /// Gets the string of an DescriptionAttribute of an Enum. ///  /// The Enum value for which the description is needed. /// If a DescriptionAttribute is set it return the content of it. /// Otherwise just the raw name as string. public static string Description(this Enum value) { if (value == null) { throw new ArgumentNullException("value"); } string description = value.ToString(); FieldInfo fieldInfo = value.GetType().GetField(description); DescriptionAttribute[] attributes = (DescriptionAttribute[]) fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false); if (attributes != null && attributes.Length > 0) { description = attributes[0].Description; } return description; } ///  /// Creates an List with all keys and values of a given Enum class ///  /// Must be derived from class Enum! /// A list of KeyValuePair<Enum, string> with all available /// names and values of the given Enum. public static IList> ToList() where T : struct { var type = typeof(T); if (!type.IsEnum) { throw new ArgumentException("T must be an enum"); } return (IList>) Enum.GetValues(type) .OfType() .Select(e => new KeyValuePair(e, e.Description())) .ToArray(); } public static T GetValueFromDescription(string description) where T : struct { var type = typeof(T); if(!type.IsEnum) { throw new ArgumentException("T must be an enum"); } foreach(var field in type.GetFields()) { var attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; if(attribute != null) { if(attribute.Description == description) { return (T)field.GetValue(null); } } else { if(field.Name == description) { return (T)field.GetValue(null); } } } throw new ArgumentOutOfRangeException("description"); // or return default(T); } } 

有了这个,你可以像这样建立你的枚举:

 public enum Foo { [Description("Foo - Something")] Something, [Description("Foo - Anything")] Anything, } 

并得到这样的列表:

 var list = EnumExtension.ToList(); 

更新:
感谢Oliver指出System.Component.DescriptionAttribute 。 这是怎么做的:

 public enum infringementCategory { [Description("INF0001")] Infringement, [Description("INF0002")] OFN } public static class DescriptionExtensions { public static string GetDescriptionValue(this Enum value) { // Get the type Type type = value.GetType(); // Get fieldinfo for this type FieldInfo fieldInfo = type.GetField(value.ToString()); // Get the stringvalue attributes DescriptionAttribute[] attribs = fieldInfo.GetCustomAttributes( typeof(DescriptionAttribute), false) as DescriptionAttribute[]; // Return the first if there was a match. return attribs.Length > 0 ? attribs[0].Description : null; } } public class Program { static void Main(string[] args) { infringementCategory category = infringementCategory.OFN; string description = category.GetDescriptionValue(); } } 

您可以将标题(INF0001)…存储在Dictionary

看到:

 public enum InfringementCategory { [EnumNamedConstant(Description = "INF0001")] Infringement, [EnumNamedConstant(Description = "INF0002")] OFN } public class Test{ public void Test() { String result = InfringementCategory.Infringement.GetDescription(); } } 

这里的扩展方法……

 #region [ EnumNamedConstantAttribute ] [AttributeUsage(AttributeTargets.Field, AllowMultiple = false)] public class EnumNamedConstantAttribute : Attribute { public string Description { get; set; } public string Value { get; set; } } #endregion #region EnumUtilities public static class EnumUtilities { #region [ + Extension Methods ] #region [ GetDescription ] public static string GetDescription(this Enum constant) { return EnumUtilities.GetEnumNamedConstantAttribute(constant).Description; } #endregion #region [ GetStringValue ] public static string GetStringValue(this Enum constant) { return GetEnumNamedConstantValue(constant); } #endregion #endregion #region [ + Static Methods ] #region [ GetEnumerable ] public static IEnumerable GetEnumerable() { T instancia = Activator.CreateInstance(); FieldInfo[] objInfos = instancia.GetType().GetFields(BindingFlags.Public | BindingFlags.Static); foreach (FieldInfo objFileInfo in objInfos) { Enum constant = (Enum)objFileInfo.GetValue(objFileInfo); if (objFileInfo.GetCustomAttributes(typeof(EnumNamedConstantAttribute), false).Length != 0) { yield return new EnumNamedConstantAttribute() { Description = EnumUtilities.GetEnumNamedConstantAttribute(constant).Description, Value = GetEnumNamedConstantValue(constant) }; } } } #endregion #endregion #region [ + Privates ] #region [ GetEnumNamedConstantAttribute ] private static EnumNamedConstantAttribute GetEnumNamedConstantAttribute(Enum constant) { FieldInfo[] objInfos = constant.GetType().GetFields(BindingFlags.Public | BindingFlags.Static); foreach (FieldInfo objFileInfo in objInfos) { Enum constantItem = (Enum)objFileInfo.GetValue(objFileInfo); if (constantItem.GetHashCode().Equals(constant.GetHashCode())) { object[] attributes = objFileInfo.GetCustomAttributes(typeof(EnumNamedConstantAttribute), false); if (attributes.Length > 0) return (EnumNamedConstantAttribute)attributes[0]; } } return null; } #endregion #region [ GetEnumNamedConstantValue ] private static string GetEnumNamedConstantValue(Enum constant) { string sValue = (constant.GetHashCode()).ToString(); EnumNamedConstantAttribute objRet = EnumUtilities.GetEnumNamedConstantAttribute(constant); if (objRet != null) { String sAux = objRet.Value; if (!String.IsNullOrEmpty(sAux)) sValue = objRet.Value; } return sValue; } #endregion #endregion } #endregion 

你有很多选择:

  1. 字典为vc74建议。 这是有效的,并将您的枚举与财产分离。

  2. 一个开关声明

  3. 如果您想要与每个关联的唯一事物是一个整数,您可以使用:

      public enum InfringementCategory { Infringement = 1, OFN = 2 } 

    然后将(int)myEnum放入String.Format ,将其转换为所需forms的字符串。

  4. 属性

     public enum InfringementCategory { [InfID("INF0001")]Infringement, [InfID("INF0002")]OFN } 

    为了提高性能,您可以使用reflection一次填充字典。