[英]c# Cast generic List of enum
我有一个我填写的枚举列表,出于多种原因,我将它转换为对象 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
}
}
}
问题是,我想将它转换回枚举的通用列表,以便我可以使用它。 我不想也不需要将它转换回它的原始枚举(它可以是许多其他枚举)。
但我总是得到一个错误: (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
已经是装箱转换,所以装箱本身似乎不是您担心(或意识到)的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.