将通用T转换为System.Enum
我有一个Enum
s列表作为IEnumerable
,我需要循环每个项目并得到它的描述如下:
IEnumerable 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
的列表吗? 什么样的演员可以做到这一点?
进行演员表的一种方法是:
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
IEnumerable首先不是System.Enum的列表吗? 什么样的演员可以做到这一点?
是的,但编译器无法确定这一点。 T
可以是运行时的任何东西。 在这种情况下,您通常使用generics类型约束,但where T : Enum
无效的情况下,您可以做的是:
- 如果您只想使用Enums,请不要使您的方法通用,将参数类型更改为
Enum
- 使用
where T : struct
约束来至少确保T
是一个值类型并检查你的方法中的类型是否为Enum
,如果它没有抛出exception等(这不推荐)
考虑使用您已经使用的类型T …
IEnumerable values = (T[])Enum.GetValues(typeof(T)); foreach (T value in values) { String mylist = Common.MyExtensions.getEnumDescription(value); }
您还必须使getEnumDesciption也是通用的。
我想你正在寻找这样的东西(稍微改变了实现):
public enum Test { [Description("This")] A, B, C, D } private IEnumerable GetEnumDescription() { var type = typeof(T); if (!type.IsEnum) throw new ArgumentException("Only Enum types allowed"); foreach (var value in Enum.GetValues(type).Cast()) { 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(); } }
电话会看起来像:
var desc = GetEnumDescription(); // "This", "B", "C", "D"
foreach(var e in values) { if(e is Enum) { Enum eAsEnum = (Enum)e; String mylist = Common.MyExtensions.getEnumDescription(eAsEnum); } }