我有多种枚举类型用作下拉列表的数据源,为了提供用户友好的描述,我给每个枚举添加了一个Description
属性,然后执行以下操作:
var list = Enum.GetValues(typeof(MyEnum))
.Cast<MyEnum>()
.ToDictionary(k => k, v => v.GetAttributeOfType<DescriptionAttribute>().Description)
.ToList();
以上内容重复出现是因为我需要在很多地方使用它。我尝试添加了一个扩展方法:
public static T GetAttributeOfType<T>(this Enum enumVal) where T : System.Attribute
{
var type = enumVal.GetType();
var memInfo = type.GetMember(enumVal.ToString());
var attributes = memInfo[0].GetCustomAttributes(typeof(T), false);
return (attributes.Length > 0) ? (T)attributes[0] : null;
}
public static KeyValuePair<T, string> ToList<T>(this Enum source)
{
return Enum.GetValues(typeof(T))
.Cast<T>()
.ToDictionary(k => k, v => v.GetAttributeOfType<DescriptionAttribute>().Description)
.ToList();
}
然而,我遇到了一个异常:
无法将 lambda 表达式转换为类型 'System.Collections.Generic.IEqualityComparer',因为它不是委托类型
如何正确地将其作为扩展方法使用(使用上述 2 种方法)?
ToList
)很奇怪。首先,它无法编译。其次,返回类型不清楚 - 你传递一个单一的Enum
值,然后使用ToDictionary(..).ToList()
来制作列表,而返回类型是单个KeyValuePair
。那么它真正应该是单个值还是列表呢?如果是列表,那么它将成为一个奇怪的扩展方法,所以你必须传递一个枚举值来获取列表,比如MyEnum.A.ToList<MyEnum>()
。简而言之,你是在寻找本文开头重复代码的等效方法吗? - Ivan Stoev