首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DynamicObject的Linq

使用DynamicObject的Linq
EN

Stack Overflow用户
提问于 2012-08-01 21:37:46
回答 2查看 6.7K关注 0票数 5

我列出了MyType : DynamicObject的位置。从DynamicObject继承MyType的原因是,我需要一个可以包含未知数量的属性的类型。

这一切都很好,直到我需要过滤列表。有没有一种方法我可以做一个linq来做这样的事情:

代码语言:javascript
复制
return all items where any of the properties is empty string or white space?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-01 22:03:28

只要每个对象的属性在内部不为其自身所知,您就可以做到这一点。

没有一种很好的通用方法来测试动态对象的所有属性,如果你不能控制DynamicObject,你希望实现者实现GetDynamicMemberNames(),你可以为getting the property namesdynamically invoking those names使用nuget包即时接口的方法。

代码语言:javascript
复制
return allItems.Where(x=> Impromptu.GetMemberNames(x, dynamicOnly:true)
                       .Any(y=>String.IsNullOrWhiteSpace(Impromptu.InvokeGet(x,y));

否则,因为它是您自己的类型MyType,所以您可以添加自己的方法,该方法可以查看这些成员值的内部核算。

代码语言:javascript
复制
return allItems.Where(x => x.MyValues.Any(y=>String.IsNullOrWhitespace(x));
票数 1
EN

Stack Overflow用户

发布于 2012-08-01 22:03:46

(来自评论)我能用List做上面的linq查询吗?

是的,以下是如何使用ExpandoObject来完成此操作

代码语言:javascript
复制
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提供了一个接口,允许您枚举它的属性-值对,就像它们在字典中一样,使检查它们的过程变得简单得多。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11760504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档