首页 > 解决方案 > 在方法中输入类型,运算符“<”不能用于类型“Type”

问题描述

我试图通过将我经常调用的东西移动到静态方法中来使我的代码更简洁。原始代码是:

List<ListItem> listItems = Enum
  .GetValues(typeof(TimelineinfoEnums.StateEnum))
  .Cast<TimelineinfoEnums.StateEnum>()
  .Select(x => new ListItem { 
     Text  = x.ToString(), 
     Value = (int)x })
  .ToList();

TimelineinfoEnums.StateEnum只是一个占位符,我的方法的重点是能够调用它,传递一个值,并制作TimelineinfoEnums.StateEnum我正在使用的其他一些枚举。在阅读了 SO 的其他地方之后,您必须对此类事情使用字符串输入,因为“实体类型在编译时实际上是未知的或可知的。”,我尝试了以下代码:

 public static List<ListItem> GetDropdownList(string @enum)
 {     
     List<ListItem> listItems = Enum
       .GetValues(@enum.GetType())
       .Cast<@enum.GetType()>()
       .Select(
          x => new ListItem { Text = x.ToString(), Value = (int)x }).ToList();            
          return listItems;
        }

但是,当我尝试这样做时,第二次@enum.GetType()出现以下错误:

运算符“<”不能应用于“方法组”和“类型”类型的操作数

我尝试删除该.GetType()位,但随后出现错误

enum 是一个变量,但用作类型

我对Linq不太熟悉,所以我可能会遗漏一些简单的东西,感谢您的帮助!

编辑: ListItem看起来像这样:

 public class ListItem
        {
            public int Value { get; set; }
            public string Text { get; set; }
        }

标签: c#linqenums

解决方案


您仍然可以使用泛型,但使用struct, EnumC# 7.3 中添加的约束:

将您的代码更改为:

public static List<ListItem> GetDropdownList<TEnum>()
    where TEnum : struct, Enum
{     
     return Enum.GetValues( typeof(TEnum) )
        .Cast<TEnum>()
        .Select( e => new ListItem() { Text = e.ToString(), Value = Convert.ToInt32( e ) } );
        .ToList();

    public static IReadOnlyList<ListItem> Items => _items;
}

请注意,上述代码的性能可以通过将其移至静态泛型类并将结果存储在静态字段中来提高,因为这将缓存结果(因为泛型类型对每种类型都存在一次,因此无需执行此计算不止一次):

public static class EnumListItems<TEnum>
    where TEnum : struct, Enum
{
    private static readonly IReadOnlyList<ListItem> _items = Enum.GetValues( typeof(TEnum) )
        .Cast<TEnum>()
        .Select( e => new ListItem() { Text = e.ToString(), Value = Convert.ToInt32( e ) } );
        .ToList();

    public static IReadOnlyList<ListItem> Items => _items;
}

像这样使用:

IReadOnlyList<ListItem> items = EnumListItems<MyEnum>.Items;

如果您需要一个可变列表,请使用.ToList()

List<ListItem> items = EnumListItems<MyEnum>.Items.ToList();

推荐阅读