c# Cast 泛型枚举列表

c# Cast generic List of enum

我有一个我填写的枚举列表,出于多种原因,我将它转换为一个对象 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:

can't cast object 'System.Collections.Generic.List1[MyEnum]' en type 'System.Collections.Generic.List1[System.Enum]'

我无法将其转换为列表,我找不到将其转换为任何通用列表的方法。 我不明白的是:在通用枚举和 MyEnum 之间,没有太大区别,它们是相同的内存 space.

你能帮我想想办法吗?

---- 编辑 --- 更多信息 哦天哪我太笨了,我忘记了: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 类型的成员,并且考虑到 MyEnumEnum 已经是装箱转换,装箱本身似乎不是您担心(或意识到)的问题。