将通用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无效的情况下,您可以做的是:

  1. 如果您只想使用Enums,请不要使您的方法通用,将参数类型更改为Enum
  2. 使用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); } }