在C#中使用泛型和枚举创建属性列表
早上好。 我需要使用泛型创建一个小助手类,但是我对泛型的了解非常少。 这就是我需要的。 我在C#中定义了枚举,以具有描述属性。比如说在C#中使用泛型和枚举创建属性列表,c#,asp.net,generics,enums,attributes,C#,Asp.net,Generics,Enums,Attributes,早上好。 我需要使用泛型创建一个小助手类,但是我对泛型的了解非常少。 这就是我需要的。 我在C#中定义了枚举,以具有描述属性。比如说 public enum EnumLineItemErrorCode { [Description("None")] None = 0, [Description("helpful Desc")] MissnigA= 1, [Description("another desc")] MissingB = 2 } 我还
public enum EnumLineItemErrorCode
{
[Description("None")]
None = 0,
[Description("helpful Desc")]
MissnigA= 1,
[Description("another desc")]
MissingB = 2
}
我还创建了帮助函数,可以从枚举中获取描述,如
public static string GetEnumDescription(Enum value)
{
FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes =
(DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
return attributes.Length > 0 ? attributes[0].Description : value.ToString();
}
现在,如果我需要desc,我可以调用如下方法
EnumerationsHelper.GetEnumDescription(EnumLineItemErrorCode.MissnigA);
但是,当我们想要对数据源进行bindind时,我目前会对枚举中的每个值执行以下操作
dropdownList.Add(new ListItem(EnumerationsHelper.GetEnumDescription(EnumLineItemErrorCode.MissnigA), EnumLineItemErrorCode.MissnigA.ToString()));
但是,随着枚举大小的增长,这种方法是不灵活的,而且因为如果我只是将值添加到枚举中,它不会自动将值添加到列表中
所以我的问题是
你能创建一个帮助器方法,它会返回一个描述、值和,
其中description是枚举描述,value是枚举内部值。
例如,我所拥有的代码将被用作
object t EnumerationsHelper.GetDescriptionAndValuesAslist(EnumLineItemErrorCode);
对象t是具有值的结构这就是您要寻找的:这将完成任务
private string[] GetEnumDescriptions<T>()
{
return Enum.GetValues(typeof(T))
.Cast<Enum>()
.Select(GetEnumDescription)
.ToArray();
}
私有字符串[]GetEnumDescriptions()
{
返回Enum.GetValues(typeof(T))
.Cast()
.选择(GetEnumDescription)
.ToArray();
}
用例:
var descriptions = GetDescriptions<EnumLineItemErrorCode>();
var descriptions=GetDescriptions();
注意:如果T不是类型
Enum
Enum.GetValues
方法将抛出异常。我很快为您编写了以下帮助器方法
public static IDictionary<string, string> GetEnumBindings<T>()
{
if (!typeof(Enum).IsAssignableFrom(typeof(T)))
{
throw new ArgumentException("The provided type is not an enum");
}
var result = new Dictionary<string, string>();
var fieldNames = Enum.GetNames(typeof (T));
foreach (var fieldName in fieldNames)
{
var fieldAttributes = typeof (T).GetField(fieldName)
.GetCustomAttributes(typeof (DescriptionAttribute), false);
var description = fieldAttributes.Any()
? ((DescriptionAttribute) fieldAttributes.First()).Description
: fieldName;
result.Add(fieldName, description);
}
return result;
}
公共静态IDictionary GetEnumBindings()
{
如果(!typeof(Enum).IsAssignableFrom(typeof(T)))
{
抛出新ArgumentException(“提供的类型不是枚举”);
}
var result=newdictionary();
var fieldNames=Enum.GetNames(typeof(T));
foreach(字段名中的变量字段名)
{
var fieldAttributes=typeof(T).GetField(fieldName)
.GetCustomAttributes(typeof(DescriptionAttribute),false);
var description=fieldAttributes.Any()
((DescriptionAttribute)fieldAttributes.First()).Description
:字段名;
结果.添加(字段名、描述);
}
返回结果;
}
用例是:
var bindings = GetEnumBindings<EnumLineItemErrorCode>();
var listItems = bindings.Select(b => new ListItem(b.Value, b.Key));
var bindings=GetEnumBindings();
var listItems=bindings.Select(b=>newlistItem(b.Value,b.Key));
之后,只需将listItems添加到DropDownList。
祝你好运
UPD:由于描述不是唯一的,我稍微修改了代码,添加了字段名作为字典的键。这个解决方案提供了实际需要的输出,非常感谢,另一个是很好的起点,但这个是完整的包