【问题标题】:Linq with DynamicObject使用 DynamicObject 的 Linq
【发布时间】:2012-08-01 13:37:46
【问题描述】:

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

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

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

【问题讨论】:

  • 还有其他类型可以包含未知属性,例如ExpandoObject。如果您可以使用ExpandoObject 而不是DynamicObject,您的生活将会轻松几个数量级。
  • 我需要检查我正在使用的 UI 控件是否支持 ExpandoObject,但如果支持,我在从 DynamicObject 转换到 ExpandoObject 时没有问题。问题是,我可以使用 List 进行上述 linq 查询吗?

标签: linq c#-4.0 dynamic


【解决方案1】:

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

【讨论】:

  • 感谢指向 ExpandoObject 的指针。我给它+1,但不能接受它作为答案,因为我不能从 ExpandoObject 继承,而且 jbtule 已经直接回答了我的问题。
【解决方案2】:

只要每个对象的属性对它们自己内部未知,你就可以做到。

没有很好的通用方法来测试动态对象的所有属性,如果您无法控制DynamicObject,您希望实现者实现GetDynamicMemberNames(),并且您可以使用 nuget 包 ImpromptuInterface 的方法对于getting the property namesdynamically invoking those names

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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多