c# - 在方法中输入类型,运算符“<”不能用于类型“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; }
}
解决方案
您仍然可以使用泛型,但使用struct, Enum
C# 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();
推荐阅读
- cmake - 对依赖于另一个 .cpp 的 .cpp 使用 SWIG
- postgresql - 无法将查询结果分配给 PostgreSQL 中的变量
- android - 如何在没有 GPS 的情况下获取 Cell ID 和 LAC?
- html - 美丽的汤获取表单提交后返回的html表单数据
- java - 房间一对多警告
- angular - Mapbox 未在 Stackblitz 中显示,但在本地计算机中显示
- android - 如何检查 arcore 图像数据库中的内容?
- javascript - 在 fullcalendar.io 上重新渲染,删除所有事件
- python - 使用 RDKIT:以整数/计数形式生成指纹
- reactjs - 日期排序在 muidatatable 中不起作用