2014-03-07 18 views
0

早上好。 我有需要创建一个小帮手类,使用泛型,但是我的泛型知识是非常低的。 所以这里是我需要的。 我已经在C#中定义了枚举,以具有描述属性。例如在C#中使用泛型和枚举来创建属性列表

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(); 
} 

现在,如果我需要说明我可以调用类似如下

EnumerationsHelper.GetEnumDescription(EnumLineItemErrorCode.MissnigA); 
方法

但是,当我们想要绑定到数据源时,我目前对枚举上的每个值执行以下操作。

dropdownList.Add(new ListItem(EnumerationsHelper.GetEnumDescription(EnumLineItemErrorCode.MissnigA), EnumLineItemErrorCode.MissnigA.ToString())); 

但这种方法不灵活的枚举尺寸增大,也因为它不会自动添加一个值列表,如果我只是把它添加到枚举。

所以我的问题是。

可以创建一个帮助器方法,它将返回一个描述,值, 列表,其中描述是枚举描述,值是枚举内部值。 例如对码,我已经将用作

object t EnumerationsHelper.GetDescriptionAndValuesAslist(EnumLineItemErrorCode); 

和对象t是与值<“无”,无“>,<‘MissnigA’,”有帮助说明“>,<”结构MissingB”, “另一种递减”>

预先感谢您

回答

0

我赶紧写了下面的辅助方法,你

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; 
} 

和使用案例是:

var bindings = GetEnumBindings<EnumLineItemErrorCode>(); 
var listItems = bindings.Select(b => new ListItem(b.Value, b.Key)); 

之后,只需添加listItems中你的DropDownList。 祝你好运!

UPD:因为说明不是唯一的,所以我修改了一些代码以添加字段名称作为字典的关键字。

+0

该解决方案提供了实际所需的输出,非常感谢,另一个是良好的起始位置,但这是一个完整的包装 –

1

这将做的工作

private string[] GetEnumDescriptions<T>() 
{ 
    return Enum.GetValues(typeof(T)) 
       .Cast<Enum>() 
       .Select(GetEnumDescription) 
       .ToArray(); 
} 

使用案例:

var descriptions = GetDescriptions<EnumLineItemErrorCode>(); 

注:如果T型不EnumEnum.GetValues方法会抛出异常。