【问题标题】:c# Cast generic List of enumc# Cast泛型枚举列表
【发布时间】:2020-10-15 15:17:47
【问题描述】:

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

无法转换对象 'System.Collections.Generic.List1[MyEnum]' en type 'System.Collections.Generic.List1[System.Enum]'

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

你能帮我弄清楚吗?

---- 编辑 --- 更多信息 天哪,我太笨了,我忘了:using System.Collections;

现在我可以这样做了:List&lt;Enum&gt; enums = (ob as IList).Cast&lt;Enum&gt;().ToList();

而且效果很好!谢谢你的陌生人。

【问题讨论】:

  • 你可以将ob转换成IList当然会引起拳击
  • MyEnum 列表与System.Enum 列表不同。如果您的演员成功,那么有人可以通过演员表引用将任何enum 添加到您的列表中。通常,当我使用 Reflection 时,我最终会使用非泛型 IList 类型:List 实现了它,它允许我将列表作为列表进行操作
  • C# 在涉及值类型时不允许泛型类型变化;所以,是的,List&lt;Enum&gt;List&lt;myEnum&gt; 之间存在很大差异,与List&lt;int&gt;List&lt;byte&gt; 等相同。我不知道如何在特定情况下避免拳击(MyEnum 到@ 987654337@ 是一个拳击转换开始),那么你为什么不简单地迭代一个IList?将列表成员强输入到Enum 对您有什么帮助?
  • Flydog57 和 InBetween 有一个很好的观点,谢谢,我现在正在查看 IList 以及如何使用它。问题是,我正在根据收到的信息类型填写 ihm,直接使用 Enum 将帮助我解析列表中的每个项目,只是为了制作一个 .GetType() 以便稍后制作一个 Enum.getValues()。 (因为ob.GetType().GenericTypeArguments.Single() 已经告诉我它们是枚举)(我理解在Enum 上制作GetType() 的相对愚蠢,但它对object 很有用,所以我有希望。

标签: c# list enums generic-programming


【解决方案1】:

读cmets我觉得你在找扩展方法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&lt;Enum&gt;。当然,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 已经是一种拳击转换,所以拳击本身似乎并不是您担心的问题(或知道)。

【讨论】:

  • 我在原帖中添加了更多信息
猜你喜欢
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
相关资源
最近更新 更多