我有一个Enum
的列表作为IEnumerable<T>
,我需要循环每个项目,并得到如下所示的描述:
IEnumerable<T> values = (T[])Enum.GetValues(typeof(T));
foreach (Enum value in values)
{
String mylist = Common.MyExtensions.getEnumDescription(value);
}
...
public static string getEnumDescription(Enum value)
{
FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attributes != null && attributes.Length > 0)
{
return attributes[0].Description;
}
else
return value.ToString();
}
这会在foreach部分产生错误
无法将“T”转换为System.Enum。
首先IEnumerable
不是System.Enum
的列表吗?
什么样的演员可以做到这一点?
答案 0 :(得分:6)
进行演员表的一种方法是:
Enum enumValueError = (Enum)value;
//compiler error: Cannot convert type 'xxx' to 'System.Enum'
Enum enumValueNoError = value as Enum;
//no error, but enumValueNoError will be null if value is not an Enum
答案 1 :(得分:4)
首先,IEnume是一个System.Enum列表吗?什么样的演员可以做到这一点?
是的,但编译器无法确定这一点。 T
可以是运行时的任何内容。在这种情况下,您通常使用泛型类型约束,但where T : Enum
无效,因此您可以做的是:
Enum
where T : struct
约束至少确保T
是值类型,并检查方法内部的类型是否为Enum
,如果它没有抛出异常等(不推荐)答案 2 :(得分:0)
考虑使用您正在使用的类型T ......
IEnumerable<T> values = (T[])Enum.GetValues(typeof(T));
foreach (T value in values)
{
String mylist = Common.MyExtensions.getEnumDescription(value);
}
您还必须使getEnumDesciption也是通用的。
答案 3 :(得分:0)
我想你正在寻找类似的东西(稍微改变了实现):
ruamel.yaml
电话会是这样的:
public enum Test
{
[Description("This")]
A,
B,
C,
D
}
private IEnumerable<string> GetEnumDescription<T>()
{
var type = typeof(T);
if (!type.IsEnum) throw new ArgumentException("Only Enum types allowed");
foreach (var value in Enum.GetValues(type).Cast<Enum>())
{
yield return getEnumDescription(value);
}
}
public string getEnumDescription(Enum value)
{
FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attributes != null && attributes.Length > 0)
{
return attributes[0].Description;
}
else
{
return value.ToString();
}
}
答案 4 :(得分:-1)
foreach(var e in values)
{
if(e is Enum)
{
Enum eAsEnum = (Enum)e;
String mylist = Common.MyExtensions.getEnumDescription(eAsEnum);
}
}