c# - 如何对对象执行 foreach 动态枚举列表
问题描述
我有一个像
{
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
}
}
我试过的:
投射到以下列表:动态、对象、字符串或 int 不起作用。它总是需要转换为
IList<MyEnum>
使用从列表中获取元素的类型
Type type = itemValue.GetType().GetGenericArguments()[0];
但编译器显示错误
type 是 var 但使用类似于 Type
我知道一些解决方法是使用字符串而不是枚举,但我想避免它。
提前致谢。
解决方案
使用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
}
推荐阅读
- aframe - aframe 截屏会冻结相机
- javascript - JSON 存储在响应变量中的什么位置?
- node.js - 如何设置“pathMatch”和 childRoutingModule 工作的路由?
- matlab - 如何将一组子情节显示为电影?
- java - spring boot 控制器映射未使用两个单独的模块注册
- c# - 表单 POST 不做任何事情
- c# - 如何在旧的 ASP.NET 网站(不是网站项目)中使用 C# 6.0 或 7.0
- kendo-grid - 将数据绑定到剑道多选下拉菜单时出现问题
- git - 如何防止开发人员推送特定文件?
- java - 无法拦截 Spring @Async