我从 API 获取 JSON 响应:
"table1": [
{
"abc": "test",
"def": "test1"
},
{
"abc": "test2",
"def": "User1"
}
]
绑定到
public List<object>? table1 { get; set; }
我想使用 Linq/Lamda 获取 User1。 下面返回0条记录:
var filteredList = table1
.Where(item =>
item.GetType().GetProperty("def",BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase)?.GetValue(item)?.ToString() is "User1" or "User2")
.ToList();
有什么问题吗
我不明白你为什么在这里尝试使用 System.Reflection 和模式匹配
is
。
借助 JSON 库(例如 Newtonsoft.Json)来读取/解析对象的字段:
using Newtonsoft.Json.Linq;
string[] filters = new string[] {"User1", "User2"};
var filteredList = table1
.Where(item => filters.Contains(JObject.FromObject(item)?.SelectToken("def").ToString()))
.ToList();
或者,如果您知道
Table
对象的结构,则可以定义并使用模型类而不是 object
类型:
public class Root
{
public List<Table>? table1 { get; set; }
}
public class Table
{
public string Abc { get; set; }
public string Def { get; set; }
}
string[] filters = new string[] {"User1", "User2"};
var filteredList = table1
.Where(item => filters.Contains(item.Def))
.ToList();
问题在于“System.Object”没有公开序列化框架可以绑定的任何属性。它们不会存在用于过滤。
一个简单的选择是使用
dynamic
类型,示例中的序列化框架明确支持该类型(通过 ExpandoObject
):
public List<dynamic> table1 { get; set; }
那么您的过滤器列表可能如下所示:
var filteredList = table1
.Where(item =>
"User1".Equals(item.def)
|| "User2".Equals(item.def))
.ToList();
这只会最小程度地改变你的例子。
最好使用显式类型定义来避免后期绑定问题,例如未接收到
def
值,但如果您专门尝试后期绑定到数据,那么 dynamic
应该适合您的需要。