我列出了MyType : DynamicObject的位置。从DynamicObject继承MyType的原因是,我需要一个可以包含未知数量的属性的类型。
这一切都很好,直到我需要过滤列表。有没有一种方法我可以做一个linq来做这样的事情:
return all items where any of the properties is empty string or white space?发布于 2012-08-01 22:03:28
只要每个对象的属性在内部不为其自身所知,您就可以做到这一点。
没有一种很好的通用方法来测试动态对象的所有属性,如果你不能控制DynamicObject,你希望实现者实现GetDynamicMemberNames(),你可以为getting the property names和dynamically invoking those names使用nuget包即时接口的方法。
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-01 22:03:46
(来自评论)我能用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提供了一个接口,允许您枚举它的属性-值对,就像它们在字典中一样,使检查它们的过程变得简单得多。
https://stackoverflow.com/questions/11760504
复制相似问题