繁体   English   中英

c# 投射枚举的泛型列表

[英]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类型的成员,并且考虑到MyEnumEnum已经是装箱转换,所以装箱本身似乎不是您担心(或意识到)的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM