首页 > 解决方案 > 如何对对象执行 foreach 动态枚举列表

问题描述

我有一个像

  {
      e1 = 0, 
      e2 = 1,
      e3 = 2,
  }

和其他枚举,如:

 enum MyOtherEnum
    {
        oe1 = 0, 
        oe2 = 1,
        oe3 = 2,
    }

和其他一些枚举。我将 json 反序列化为对象,对象成员之一是列表MyEnumMyOtherEnum.

无论枚举类型如何,我都需要在列表上执行 foreach

我检查了这个成员是否是一个列表,并尝试foreach在这个列表上执行如下操作:

var itemValue = item.GetValue(json);
    
if (IsList(itemValue))
{
   foreach (var listItem in (IEnumerable<dynamic>)itemValue)
   {
      //do something
   }
}

我试过的:

  1. 投射到以下列表:动态、对象、字符串或 int 不起作用。它总是需要转换为IList<MyEnum>

  2. 使用从列表中获取元素的类型

    Type type = itemValue.GetType().GetGenericArguments()[0];
    

    但编译器显示错误

    type 是 var 但使用类似于 Type

我知道一些解决方法是使用字符串而不是枚举,但我想避免它。

提前致谢。

标签: c#.netreflectionforeachenums

解决方案


使用Json.NET,您可以这样做:

// here the itemValue is a dynamic
var itemValue = item.GetValue(json);
var token = JToken.Parse(itemValue.ToString());

if (token is JArray)
{
    IEnumerable<MyEnum> myEnums = token.ToObject<List<MyEnum>>();
    
    foreach (var listItem in myEnums)
    {
        // do something
    }
}

编辑:如果您有另一个枚举,我建议您将 JSON 更改为如下所示:

测试.json:

{
    "MyEnum":[ "2", "1", "2" ],
    "MyOtherEnum":[ "2", "1", "1" ],
}

因此,您可以执行以下操作:

string jsonData = string.Empty;
jsonData = File.ReadAllText(@"\test.json");

dynamic myEnums = JsonConvert.DeserializeObject(jsonData);

var myEnumValues = myEnums.MyEnum;
var otherEnumValues = myEnums.MyOtherEnum;

foreach (var listItem in myEnumValues)
{
    // do something
}

foreach (var listItem in otherEnumValues)
{
    // do something else
}

推荐阅读