[英]Cannot convert type 'TEnum' to 'int'
我正在尝试将枚举转换为本示例中提到的列表,例如
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()
如何修复上面的代码。
为什么它使用通用枚举而不是普通枚举给出编译错误
编辑:我已经尝试了线程中的建议,但我得到了进一步的错误:
这是我的完整代码:
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();
}
但我得到一个运行时错误
ArgumentException:提供的类型必须是枚举。
参数名称:枚举类型
在线上
return Enum.GetValues(typeof(TEnum)).Cast<TEnum>().Select(v => new SelectListItem
{
Text = v.ToString(),
Value = Convert.ToInt32(v).ToString()
}).ToList();
我需要在代码中修复什么才能避免运行时错误。
你已经告诉编译器没有关于TEnum
事了。 就其而言,它可以是字符串,DateTime,BankAccount,Bullet或任何东西。
要使其工作,您可以使用Enum.Parse
和Convert.ToInt32
UPD:我只需格式化注释中的代码并修复SO-copy-pasters的编译错误:D
public static int GetEnumIntValue<T>(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<SelectListItem> GetEnumList<TEnum>()
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<SelectListItem> GetEnumList(Type enumType)
{
return Enum.GetValues(enumType).Cast<IFormattable>().Select(v => new SelectListItem
{
Text = v.ToString(),
Value = v.ToString("d", null)
}).ToList();
}
这两种方法都不是编译类型安全的。 通用,因为缺乏enum connstraint。 非泛型 - 嗯,它类似于Enum
静态方法,无论如何都不是编译类型安全的。 如果使用非枚举类型调用,这两种方法都将抛出运行时异常。
public static List<SelectListItem> GetEnumList<TEnum>(TEnum value) where TEnum : IConvertible
{
return Enum.GetValues(typeof(TEnum)).Cast<TEnum>().Select(v => new SelectListItem
{
Text = v.ToString(),
Value = v.ToInt32(null).ToString()
}).ToList();
}
.Cast<MyEnum>()
之后使用Enum类型。 .Cast<TEnum>()
编译器不知道哪个类型可以。 编译器抱怨,因为泛型方法中的类型参数不受约束
方法也不必是通用的
public static List<SelectListItem> GetEnumList(Enum value)
{
return Enum.GetValues(value.GetType())
.Cast<Enum>()
.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.
这对我有用,扩展方法:
public static List<IdNameDto> ToIdNameList<TEnum>(this TEnum @enum) where TEnum : Enum
{
return Enum.GetValues(typeof(TEnum)).Cast<TEnum>()
.Select(x => new IdNameDto
{
Id = Convert.ToInt32(x),
Name = Humanize(x.ToString()),
}).ToList();
}
dto:
public class IdNameDto
{
public int Id { get; set; }
public string Name { get; set; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.