C# 作为枚举的键值对
我可以有一个作为键值对的枚举吗C# 作为枚举的键值对,c#,.net,enums,C#,.net,Enums,我可以有一个作为键值对的枚举吗 public enum infringementCategory { Infringement, OFN } 如果我选择侵权我应该得到“INF0001”,如果我选择OFN我应该得到“INF0002” 可能吗?您可以存储标题(INF0001)。。。在字典中可以使用修饰符将字符串表示与枚举值相关联。检查此问题: 它看起来像: public enum infringementCategory { [Description("INF0001"
public enum infringementCategory
{
Infringement,
OFN
}
如果我选择侵权
我应该得到“INF0001”,如果我选择OFN
我应该得到“INF0002”
可能吗?您可以存储标题(INF0001)。。。在
字典中
可以使用修饰符将字符串表示与枚举值相关联。检查此问题:
它看起来像:
public enum infringementCategory
{
[Description("INF0001")]
Infringement,
[Description("INF0002")]
OFN
}
看起来比使用字典更整洁,需要的维护更少。更新:
谢谢奥利弗的指点。以下是如何做到这一点:
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();
}
}
您有许多选择:
public enum InfringementCategory
{
Infringement = 1,
OFN = 2
}
然后将(int)myEnum
放入String.Format
中,将其转换为所需格式的字符串public enum InfringementCategory
{
[InfID("INF0001")]Infringement,
[InfID("INF0002")]OFN
}
为了提高性能,您可以使用反射一次来填充字典这些扩展如何:
public static class EnumExtension
{
/// <summary>
/// Gets the string of an DescriptionAttribute of an Enum.
/// </summary>
/// <param name="value">The Enum value for which the description is needed.</param>
/// <returns>If a DescriptionAttribute is set it return the content of it.
/// Otherwise just the raw name as string.</returns>
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;
}
/// <summary>
/// Creates an List with all keys and values of a given Enum class
/// </summary>
/// <typeparam name="T">Must be derived from class Enum!</typeparam>
/// <returns>A list of KeyValuePair<Enum, string> with all available
/// names and values of the given Enum.</returns>
public static IList<KeyValuePair<Enum, string>> ToList<T>() where T : struct
{
var type = typeof(T);
if (!type.IsEnum)
{
throw new ArgumentException("T must be an enum");
}
return (IList<KeyValuePair<Enum, string>>)
Enum.GetValues(type)
.OfType<Enum>()
.Select(e => new KeyValuePair<Enum, string>(e, e.Description()))
.ToArray();
}
public static T GetValueFromDescription<T>(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<Foo>();
var list=EnumExtension.ToList();
请参见:
这里是扩展方法
#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<EnumNamedConstantAttribute> GetEnumerable<T>()
{
T instancia = Activator.CreateInstance<T>();
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
#区域[EnumNamedConstantAttribute]
[AttributeUsage(AttributeTargets.Field,AllowMultiple=false)]
公共类EnumNamedConstantAttribute:属性
{
公共字符串说明{get;set;}
公共字符串值{get;set;}
}
#端区
#区域枚举实用程序
公共静态类枚举实用程序
{
#区域[+扩展方法]
#区域[GetDescription]
公共静态字符串GetDescription(此枚举常量)
{
返回EnumUtilities.GetEnumNamedConstantAttribute(常量).Description;
}
#端区
#区域[GetStringValue]
公共静态字符串GetStringValue(此枚举常量)
{
返回GetEnumNamedConstantValue(常量);
}
#端区
#端区
#区域[+静态方法]
#区域[GetEnumerable]
公共静态IEnumerable GetEnumerable()
{
T instancia=Activator.CreateInstance();
FieldInfo[]objInfos=instancia.GetType().GetFields(BindingFlags.Public | BindingFlags.Static);
foreach(objInfos中的FieldInfo objFileInfo)
{
枚举常量=(Enum)objFileInfo.GetValue(objFileInfo);
if(objFileInfo.GetCustomAttributes(typeof(EnumNamedConstantAttribute),false)。长度!=0)
{
返回新的EnumNamedConstantAttribute()
{
Description=EnumUtilities.GetEnumNamedConstantAttribute(常量)。Description,
值=GetEnumNamedConstantValue(常量)
};
}
}
}
#端区
#端区
#地区[+私人]
#区域[GetEnumNamedConstantAttribute]
私有静态EnumNamedConstantAttribute GetEnumNamedConstantAttribute(枚举常量)
{
FieldInfo[]objInfos=constant.GetType().GetFields(BindingFlags.Public | BindingFlags.Static);
foreach(objInfos中的FieldInfo objFileInfo)
{
Enum constantItem=(Enum)objFileInfo.GetValue(objFileInfo);
if(constantItem.GetHashCode().Equals(constant.GetHashCode()))
{
object[]attributes=objFileInfo.GetCustomAttributes(typeof(EnumNamedConstantAttribute),false);
如果(attributes.Length>0)
返回(EnumNamedConstantAttribute)属性[0];
}
}
返回null;
}
#端区
#区域[GetEnumNamedConstantValue]
私有静态字符串GetEnumNamedConstantValue(枚举常量)
{
字符串sValue=(constant.GetHashCode()).ToString();
EnumNamedConstantAttribute objRet=EnumUtilities.GetEnumNamedConstantAttribute(常量);
if(objRet!=null)
{
字符串sAux=objRet.Value;
如果(!String.IsNullOrEmpty(sAux))
S值=对象集值;
}
返回值;
}
#端区
#端区
}
#端区
如果可以,为什么要使用自写属性?@Oliver我同意,尽管这篇博文也有一个获取属性值的扩展方法。在您的情况下,Enum的可能重复项不是一个好选择,请改用Dictionary。
#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<EnumNamedConstantAttribute> GetEnumerable<T>()
{
T instancia = Activator.CreateInstance<T>();
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