繁体   English   中英

无法将类型“TEnum”转换为“int”

[英]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()
  1. 如何修复上面的代码。

  2. 为什么它使用通用枚举而不是普通枚举给出编译错误


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

这是我的完整代码:

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

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

通用

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();
}
  1. Complier知道你在.Cast<MyEnum>()之后使用Enum类型。
  2. 但之后.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM