我有列表,其中 MyType:DynamicObject。MyType 继承自 DynamicObject 的原因是我需要一个可以包含未知数量属性的类型。
在我需要过滤列表之前,一切正常。有没有办法我可以做一个 linq 来做这样的事情:
return all items where any of the properties is empty string or white space?
(来自评论)我可以用 List 做上面的 linq 查询吗?
是的,您可以这样做ExpandoObject
:
var list = new List<ExpandoObject>();
dynamic e1 = new ExpandoObject();
e1.a = null;
e1.b = "";
dynamic e2 = new ExpandoObject();
e2.x = "xxx";
e2.y = 123;
list.Add(e1);
list.Add(e2);
var res = list.Where(
item => item.Any(p => p.Value == null || (p.Value is string && string.IsNullOrEmpty((string)p.Value)))
);
提供ExpandoObject
了一个接口,让您可以像在字典中一样枚举其属性-值对,从而使检查它们的过程变得更加简单。
好吧,只要每个对象的属性在它们自己内部不是未知的,您就可以做到。
没有一个很好的通用方法来测试动态对象的所有属性,如果你无法控制DynamicObject
你希望实现者实现的GetDynamicMemberNames()
,你可以使用 nuget 包 ImpromptuInterface 的方法来获取属性名称并动态调用那些名字。
return allItems.Where(x=> Impromptu.GetMemberNames(x, dynamicOnly:true)
.Any(y=>String.IsNullOrWhiteSpace(Impromptu.InvokeGet(x,y));
否则,由于它是您自己的类型MyType
,您可以添加自己的方法来查看这些成员值的内部核算。
return allItems.Where(x => x.MyValues.Any(y=>String.IsNullOrWhitespace(x));