如何解决输入方法的类型,操作符“ <”不能用于类型“ 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()
位,但是随后出现错误消息
枚举是一个变量,但像类型一样使用
我对Linq不太熟悉,所以我可能会缺少一些简单明了的东西,谢谢您的帮助!
编辑: ListItem
看起来像这样:
public class ListItem
{
public int Value { get; set; }
public string Text { get; set; }
}
解决方法
您仍然可以使用泛型,但可以使用C#7.3中添加的struct,Enum
约束:
将代码更改为此:
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;
}
请注意,上述代码的性能可以通过将其移至 static泛型类并将结果存储在static字段中来提高,因为这会缓存结果(因为泛型类型对于每个类型都存在一次类型,因此无需多次执行此计算):
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();
,
实体类型在编译时实际上是未知的或未知的
您appear to have to use Cast<T>()
做anything meaningful with Linq,因为Enum.GetValues()
的返回类型从未更新为支持Linq的通用集合。另外,@enum.GetType()
将始终返回System.String
。
您要提取的唯一内容是枚举成员的整数和文本值,您可以从 any 枚举中提取这些值。所以:
private static List<ListItem> GetListItems<TEnum>()
{
var result = new List<ListItem>();
foreach (object e in Enum.GetValues(typeof(TEnum)))
{
result.Add(new ListItem
{
Text = e.ToString(),Value = (int)e
});
}
return result;
}
使用C# 7.3 and up,you should constrain TEnum
to System.Enum
时。如果您希望使用Linq而不是循环,则可以使用Enum.GetValues(typeof(TEnum)).Cast<System.Enum>()
。
现在,如果在编译时不了解TEnum
,请查看How to call generic method with a given Type object?和Type.GetType(enumName)
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。