问题描述
我有一个我填写的枚举列表,出于多种原因,我将其强制转换为对象ob。函数接收此对象,然后尝试将其解析为通用Enum。
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
}
}
}
问题是,我想将其转换回通用的Enum列表,以便我可以使用它。我不需要也不需要将其强制转换回其原始枚举(可以是许多其他枚举)。
但是我仍然在以下方面遇到错误: (List<Enum>)ob
:
无法转换对象'System.Collections.Generic.List
1[MyEnum]' en type 'System.Collections.Generic.List
1 [System.Enum]'
我无法将其转换为列表,也找不到将其转换为任何通用列表的方法。 我不明白的是:在通用Enum和MyEnum之间,没有太大区别,它是相同的内存空间。
你能帮我弄清楚吗?
----编辑---更多信息
噢,天哪,我太傻了,我忘了:using System.Collections;
现在我可以做:List<Enum> enums = (ob as IList).Cast<Enum>().ToList();
它工作得很好!谢谢你陌生人。
解决方法
阅读评论,我认为您正在寻找扩展方法Cast
的简单方法:
var o = //some List<myEmum>;
List<Enum> enums = (o as IList).Cast<Enum>().ToList();
foreach (var e in enums)
{
//whatever you need to do with e
}
现在您可以迭代List<Enum>
。当然,Cast
只是一个简单的投影,您可以在循环中手动完成它:
var listOfObjects = o as IList;
foreach (var o in listOfObjects)
{
var e = (Enum)o;
//whatever you need to do with e
}
在两种情况下,您都需要进行拳击操作。 MyEnum
是一种值类型,在与非通用IList
进行交互时,您隐式地将(“装箱”)列表中的所有成员强制转换为对象。但是,由于您似乎想实际使用Enum
类型的成员,并且考虑到MyEnum
到Enum
已经是拳击转换,因此拳击本身似乎并不是您担心(或意识到)的问题。