【问题标题】:How to perform foreach on object with is list of enum dynamically如何使用枚举列表动态地对对象执行 foreach
【发布时间】:2020-12-27 15:22:46
【问题描述】:

我有一个类似的枚举

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

和其他枚举,如:

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

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

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

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

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

我尝试过的:

  1. 强制转换为以下列表:动态、对象、字符串或 int 不起作用。它总是需要转换为IList&lt;MyEnum&gt;

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

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

    但编译器显示错误

    type 是 var 但与 Type 一样使用

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

提前致谢。

【问题讨论】:

    标签: c# .net reflection foreach enums


    【解决方案1】:

    使用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 更改为如下所示:

    test.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
    }
    

    【讨论】:

    • 是的,但我需要在不同枚举类型的列表上独立执行 foreach,例如在 post: MyEnum 或 Other Enum 中。但感谢您的时间和善意
    • 好吧,我一开始不了解其他枚举。我建议您更改 JSON 结构,以便代码可以理解哪个是哪个。我已经编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    相关资源
    最近更新 更多