我得到了以下模型代码:
public enum EnumTest
{
[Description ("Enum Text 1")]
Value_1 = 1,
[Description ("Enum Text 2")]
Value_2 = 2,
}
public List<Fields> listFields = new List<Fields>();
public class Fields
{
public int Code { get; set;}
public string Description { get; set;}
}
我有一个Enum,我想用枚举值填充我的变量CODE,并使用相同的枚举描述填充变量Description。我查了很长时间,但未能使用枚举值VALUE / DESCRIPTION将我的“ListFields”初始化为其构造函数。
我已经获得了enum和方法来获取它的描述..我发现它很有用,所以我会留在这里,也许它对某人有用..
public static string GetDescription(this Enum value)
{
return (from m in value.GetType().GetMember(value.ToString())
let attr =(DescriptionAttribute)m.GetCustomAttributes(typeof(DescriptionAttribute), false).FirstOrDefault()
select attr == null ? value.ToString() : attr.Description).FirstOrDefault();
}
要使用此功能,您只需要执行以下操作:
String xx = Enum.EnumName.GetDescription();
答案 0 :(得分:1)
你必须使用反射。
public static Fields[] GetEnumFields(Type enumType)
{
if (enumType == null)
throw new ArgumentNullException("enumType");
if (!enumType.IsEnum)
throw new ArgumentException("Not an enum");
FieldInfo[] fieldInfos = enumType.GetFields(BindingFlags.Static | BindingFlags.Public);
Fields[] result = new Fields[fieldInfos.Length];
for (int i = 0; i < fieldInfos.Length; ++i)
{
FieldInfo field = fieldInfos[i];
int value = (int)field.GetValue(null);
DescriptionAttribute attrib = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
string desc = attrib != null ? attrib.Description : field.Name;
result[i] = new Fields(value, desc);
}
return result;
}
public class Fields
{
private int value;
private string description;
public int Value
{
get { return this.value; }
}
public string Description
{
get { return this.description; }
}
public Fields(int value, string description)
{
this.value = value;
this.description = description;
}
}
使用它非常简单:
enum test
{
[Description("hello!")]
ciao,
www
}
static void Main(string[] args)
{
foreach (Fields f in GetEnumFields(typeof(test)))
{
Console.WriteLine(f.Description);
}
}
在我的实现中,当找不到descriptionattribute时,使用字段名称。
我们还必须说,反射可能很慢并且在需要时重建整个阵列是浪费时间,如果你经常需要的话。 您可以将数组存储在某个位置,这样您只能计算一次并保持缓存。 当然,正如我所说的那样,只有在经常需要这个只读列表时才有意义。