无法将类型’TEnum’转换为’int’

我正在尝试将枚举转换为List,如本例中所述,例如

Enum.GetValues(typeof(MyEnum)).Cast().Select(v => new SelectListItem { Text = v.ToString(), Value = ((int)v).ToString() }).ToList(); 

这项工作,但我想修改它以使用通用枚举

 public static List GetEnumList(TEnum value) { return Enum.GetValues(typeof(TEnum)).Cast().Select(v => new SelectListItem { Text = v.ToString(), Value = ((int)v).ToString() }).ToList(); } 

但是上面的代码没有编译和给出

无法将类型’TEnum’转换为’int’

为线

  Value = ((int)v).ToString() 
  1. 我如何修复上面的代码。

  2. 为什么它使用generics枚举而不是正常的枚举给出编译错误


编辑:我已经尝试了线程中的建议,但我得到了进一步的错误:

这是我的完整代码:

 public static IHtmlContent EnumDropDownListFor( this IHtmlHelper htmlHelper, Expression<Func> expression, TEnum enumValue, string optionLabel) { return htmlHelper.DropDownListFor(expression, (IEnumerable)GetEnumList(enumValue), optionLabel); } public static List GetEnumList(TEnum value) { return Enum.GetValues(typeof(TEnum)).Cast().Select(v => new SelectListItem { Text = v.ToString(), Value = Convert.ToInt32(v).ToString() }).ToList(); } 

但是我遇到了运行时错误

ArgumentException:提供的类型必须是Enum。

参数名称:enumType

在线上

 return Enum.GetValues(typeof(TEnum)).Cast().Select(v => new SelectListItem { Text = v.ToString(), Value = Convert.ToInt32(v).ToString() }).ToList(); 

我需要在代码中修复什么才能获得运行时错误。

您不需要值,只需要枚举类型。 你可以使用这样的东西

通用

 public static List GetEnumList() where TEnum : struct, IConvertible, IFormattable { return ((TEnum[])Enum.GetValues(typeof(TEnum))).Select(v => new SelectListItem { Text = v.ToString(), Value = v.ToString("d", null) }).ToList(); } 

非通用的

 public static List GetEnumList(Type enumType) { return Enum.GetValues(enumType).Cast().Select(v => new SelectListItem { Text = v.ToString(), Value = v.ToString("d", null) }).ToList(); } 

这两种方法都不是编译类型安全的。 通用,因为缺乏enum connstraint。 非generics – 嗯,它类似于Enum静态方法,无论如何都不是编译类型安全的。 如果使用非枚举类型调用,这两种方法都将抛出运行时exception。

你已经告诉编译器没有关于TEnum事了。 就其而言,它可以是字符串,DateTime,BankAccount,Bullet或任何东西。

要使其工作,您可以使用Enum.ParseConvert.ToInt32

UPD:我只需格式化注释中的代码并修复SO-copy-pasters的编译错误:D

 public static int GetEnumIntValue(T value) where T : struct { Type genericType = typeof(T); Debug.Assert(genericType.IsEnum); Enum enumValue = Enum.Parse(genericType, value.ToString()) as Enum; return Convert.ToInt32(enumValue); } 
 public static List GetEnumList(TEnum value) where TEnum : IConvertible { return Enum.GetValues(typeof(TEnum)).Cast().Select(v => new SelectListItem { Text = v.ToString(), Value = v.ToInt32(null).ToString() }).ToList(); } 
  1. Complier知道你在.Cast()之后使用Enum类型。
  2. 但是之后.Cast()编译器不知道哪个类型可以。

编译器抱怨,因为generics方法中的类型参数不受约束

方法也不必是通用的

 public static List GetEnumList(Enum value) { return Enum.GetValues(value.GetType()) .Cast() .Select(v => new SelectListItem { Text = v.ToString(), Value = Convert.ToInt32(v).ToString() }) .ToList(); } 

这里仍然可能是一个问题,如果基础类型的枚举不是int

 public enum LongEnum: ulong { A = 0, B = 3000000000 } // Run-time exception: Value was either too large or too small for an Int32.