【发布时间】:2020-10-15 15:17:47
【问题描述】:
我有一个我填写的枚举列表,出于多种原因,我将它转换为一个对象 ob。函数接收此对象并尝试将其解析为通用枚举。
List<MyEnum> mList = new List<MyEnum>();
// i fill my list
mList.Add(MyEnum.FirstValue);
//...
object ob = mList;
if (ob.GetType().IsGenericType && ob.GetType().GetGenericTypeDefinition() == typeof(List<>))
{
Type subTypeOb = ob.GetType().GenericTypeArguments.Single();
if (subTypeOb.IsEnum)
{
foreach (Enum subOb in (List<Enum>)ob)
{
// do stuff
}
}
}
问题是,我想将它转换回一个通用的枚举列表,以便我可以使用它。我不想也不需要将其转换回原来的枚举(它可以是许多其他枚举)。
但我总是收到错误消息: (List<Enum>)ob:
无法转换对象 'System.Collections.Generic.List
1[MyEnum]' en type 'System.Collections.Generic.List1[System.Enum]'
我无法将其转换为列表,我找不到将其转换为任何通用列表的方法。 我不明白的是:在通用 Enum 和 MyEnum 之间,没有太大区别,它是相同的内存空间。
你能帮我弄清楚吗?
---- 编辑 --- 更多信息
天哪,我太笨了,我忘了:using System.Collections;
现在我可以这样做了:List<Enum> enums = (ob as IList).Cast<Enum>().ToList();
而且效果很好!谢谢你的陌生人。
【问题讨论】:
-
你可以将
ob转换成IList当然会引起拳击 -
MyEnum列表与System.Enum列表不同。如果您的演员成功,那么有人可以通过演员表引用将任何enum添加到您的列表中。通常,当我使用 Reflection 时,我最终会使用非泛型IList类型:List实现了它,它允许我将列表作为列表进行操作 -
C# 在涉及值类型时不允许泛型类型变化;所以,是的,
List<Enum>和List<myEnum>之间存在很大差异,与List<int>和List<byte>等相同。我不知道如何在特定情况下避免拳击(MyEnum到@ 987654337@ 是一个拳击转换开始),那么你为什么不简单地迭代一个IList?将列表成员强输入到Enum对您有什么帮助? -
Flydog57 和 InBetween 有一个很好的观点,谢谢,我现在正在查看
IList以及如何使用它。问题是,我正在根据收到的信息类型填写 ihm,直接使用Enum将帮助我解析列表中的每个项目,只是为了制作一个.GetType()以便稍后制作一个Enum.getValues()。 (因为ob.GetType().GenericTypeArguments.Single()已经告诉我它们是枚举)(我理解在Enum上制作GetType()的相对愚蠢,但它对object很有用,所以我有希望。
标签: c# list enums generic-programming