Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中使用泛型和枚举创建属性列表_C#_Asp.net_Generics_Enums_Attributes - Fatal编程技术网

在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 } 我还

早上好。 我需要使用泛型创建一个小助手类,但是我对泛型的了解非常少。 这就是我需要的。 我在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();
}
现在,如果我需要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:由于描述不是唯一的,我稍微修改了代码,添加了字段名作为字典的键。

这个解决方案提供了实际需要的输出,非常感谢,另一个是很好的起点,但这个是完整的包