如何获取System.Linq.Dynamic.Core动态查询列的值与类型?
解决动态查询结果转带值和类型结构的问题
看起来你已经走对了方向,但卡在了针对每个属性单独处理值和类型这一步上。咱们一步步拆解问题:
问题根源
你之前的两种写法都没命中核心需求:
- 第一种写法
MyHelper.GetType(x)里的x是整个匿名对象实例,但你的GetType方法需要的是PropertyInfo类型的参数,类型不匹配所以报错。 - 第二种写法
MyHelper.GetType(x.GetType())传入的是匿名类型的整体Type,得到的是匿名类型的名称(比如<>f__AnonymousType03`),而不是每个属性的实际类型,自然不符合需求。
正确解决方案
因为你是用动态查询得到的匿名类型集合,我们需要通过反射遍历每个对象的单个属性,分别获取属性值和属性类型,再组装成你要的结构。
代码实现(用字典返回)
var rows = data.Select(item => { var itemType = item.GetType(); // 遍历当前对象的所有属性 return itemType.GetProperties().ToDictionary( prop => prop.Name, // 键为列名 prop => new { value = prop.GetValue(item), // 获取属性值 type = MyHelper.GetType(prop) // 用你的方法获取属性类型 } ); });
代码实现(用ExpandoObject返回,序列化后更贴近示例JSON)
如果希望返回的对象在序列化后和你给出的示例结构完全一致,可以用ExpandoObject:
var rows = data.Select(item => { var result = new ExpandoObject() as IDictionary<string, object>; var itemType = item.GetType(); foreach (var prop in itemType.GetProperties()) { result[prop.Name] = new { value = prop.GetValue(item), type = MyHelper.GetType(prop) }; } return result; });
验证你的MyHelper.GetType方法
你的类型处理方法是没问题的:
- 对于可空类型(比如
Nullable<decimal>),会返回底层的decimal - 对于普通类型(比如
string),会直接返回类型名称
用上面的代码处理后,你会得到和示例一致的结果:
[ { "col1": { "value": "This", "type": "string" }, "col2": { "value": 1.56, "type": "decimal" }, "col3": { "value": "Something else", "type": "string" } } ]
内容的提问来源于stack exchange,提问作者Pablo
相关产品推荐
相关产品推荐

