c#泛型枚举列表

问题描述

我有一个我填写的枚举列表,出于多种原因,我将其强制转换为对象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类型的成员,并且考虑到MyEnumEnum已经是拳击转换,因此拳击本身似乎并不是您担心(或意识到)的问题。