无法将类型’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()
-
我如何修复上面的代码。
-
为什么它使用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.Parse
和Convert.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(); }
- Complier知道你在
.Cast
之后使用Enum类型。() - 但是之后
.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.