5

我有列表,其中 MyType:DynamicObject。MyType 继承自 DynamicObject 的原因是我需要一个可以包含未知数量属性的类型。

在我需要过滤列表之前,一切正常。有没有办法我可以做一个 linq 来做这样的事情:

return all items where any of the properties is empty string or white space?
4

2 回答 2

3

(来自评论)我可以用 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了一个接口,让您可以像在字典中一样枚举其属性-值对,从而使检查它们的过程变得更加简单。

于 2012-08-01T14:03:45.890 回答
1

好吧,只要每个对象的属性在它们自己内部不是未知的,您就可以做到。

没有一个很好的通用方法来测试动态对象的所有属性,如果你无法控制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));
于 2012-08-01T14:03:27.663 回答