我正在尝试将一个枚举转换为一个列表,如this示例中所述。
Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Select(v => new SelectListItem {
Text = v.ToString(),
Value = ((int)v).ToString()
}).ToList();
这个工作,但我想修改它,以工作与泛型枚举
public static List<SelectListItem> GetEnumList<TEnum>(TEnum value)
{
return Enum.GetValues(typeof(TEnum)).Cast<TEnum>().Select(v => new SelectListItem
{
Text = v.ToString(),
Value = ((int)v).ToString()
}).ToList();
}
但是,上面的代码不会编译并给出
无法将类型'TEnum'转换为'int'
用于生产线
Value = ((int)v).ToString()
1.我如何修复这个上面的代码。
1.为什么泛型枚举会产生编译错误,而普通枚举则不会
编辑:我已经尝试了线程中的建议,但我得到了进一步的错误:
下面是我的完整代码:
public static IHtmlContent EnumDropDownListFor<TModel, TResult,TEnum>(
this IHtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TResult>> expression,
TEnum enumValue,
string optionLabel)
{
return htmlHelper.DropDownListFor(expression, (IEnumerable<SelectListItem>)GetEnumList(enumValue), optionLabel);
}
public static List<SelectListItem> GetEnumList<TEnum>(TEnum value)
{
return Enum.GetValues(typeof(TEnum)).Cast<TEnum>().Select(v => new SelectListItem
{
Text = v.ToString(),
Value = Convert.ToInt32(v).ToString()
}).ToList();
}
但我收到运行时错误
参数异常:提供的类型必须是枚举。
参数名称:枚举类型
在线
return Enum.GetValues(typeof(TEnum)).Cast<TEnum>().Select(v => new SelectListItem
{
Text = v.ToString(),
Value = Convert.ToInt32(v).ToString()
}).ToList();
我需要在代码中修复什么才不会出现运行时错误。
5条答案
按热度按时间vojdkbi01#
你没有告诉编译器任何关于
TEnum
的信息。就它而言,它可以是一个字符串、一个DateTime、一个BankAccount、一个Bullet或任何东西。要使其工作,可以使用
Enum.Parse
和Convert.ToInt32
UPD:让我从注解中格式化代码,并修复SO-copy-pasters的编译错误:D
swvgeqrz2#
您不需要值,只需要枚举类型。
这两个方法都不是编译类型安全的。泛型,因为缺少枚举约束。非泛型-好吧,它类似于
Enum
静态方法,无论如何都不是编译类型安全的。如果使用非枚举类型调用,这两个方法都将引发运行时异常。5f0d552i3#
1.编译器知道您在
.Cast<MyEnum>()
之后使用Enum类型。1.但是在
.Cast<TEnum>()
之后,编译器并不知道类型可以是哪个。ldfqzlk84#
由于泛型方法中类型参数未受约束,编译器发出抱怨
方法也不必是泛型
如果enum基础类型不是
int
,则仍然存在问题:lrpiutwd5#
这就是对我有效的Extension方法:
日期: