linq 无法将类型'TEnum'转换为'int'

vzgqcmou  于 2022-12-06  发布在  其他
关注(0)|答案(5)|浏览(162)

我正在尝试将一个枚举转换为一个列表,如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();

我需要在代码中修复什么才不会出现运行时错误。

vojdkbi0

vojdkbi01#

你没有告诉编译器任何关于TEnum的信息。就它而言,它可以是一个字符串、一个DateTime、一个BankAccount、一个Bullet或任何东西。
要使其工作,可以使用Enum.ParseConvert.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);
}
swvgeqrz

swvgeqrz2#

您不需要值,只需要枚举类型。

  • 通用 *
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静态方法,无论如何都不是编译类型安全的。如果使用非枚举类型调用,这两个方法都将引发运行时异常。

5f0d552i

5f0d552i3#

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();
}

1.编译器知道您在.Cast<MyEnum>()之后使用Enum类型。
1.但是在.Cast<TEnum>()之后,编译器并不知道类型可以是哪个。

ldfqzlk8

ldfqzlk84#

由于泛型方法中类型参数未受约束,编译器发出抱怨
方法也不必是泛型

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();
}

如果enum基础类型不是int,则仍然存在问题:

public enum LongEnum: ulong
{
    A = 0,
    B = 3000000000
}

// Run-time exception: Value was either too large or too small for an Int32.
lrpiutwd

lrpiutwd5#

这就是对我有效的Extension方法:

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 = x.ToString(),
        }).ToList();
}

日期:

public class IdNameDto
{
    public int Id { get; set; }
    public string Name { get; set; }
}

相关问题