【问题标题】:Filter out some properties from a list of objects从对象列表中过滤掉一些属性
【发布时间】:2018-10-12 09:21:18
【问题描述】:

我有一个包含 10 个属性的对象列表 (MyObject)。

Class MyObject{
   string F1,
    string F2,
   ....
   string F10
}

 var myList = new List<MyObject> ()

根据字符串列表中提供的输入,我必须从该 mylist 中过滤掉一些属性并获取所选项目的新列表。

var requiredFlields = new List<String> {"F1", "F2"}

我知道:

var o1 = myList.Select(a => new {  a.F1, a.F2 }).ToList();

但它不允许我使用 requiredFields 列表进行过滤。

有没有办法做到这一点?

【问题讨论】:

  • 您可以为此使用反射并从属性信息列表中过滤
  • 类似这样的东西(未经测试)typeof(MyObject).GetProperties().Where(x =&gt; requiredFields.Contains(x.Name)).SelectMany(y =&gt; myList.Select(x =&gt; y.GetValue(x, null)) - 必须小心属性是什么以及变量是什么
  • 是的,myList 是 List 类型,它包含许多对象

标签: c# list oop collections filter


【解决方案1】:

您可以使用GetProperties() 函数从类中获取属性详细信息。使用它可以获取所有属性的详细信息。

遍历每个属性并检查该属性的名称是否存在于类中。

示例代码:

PropertyInf[] propertiesInfo = MyObject.GetType().GetProperties();
foreach(PropertyInfo item in propertiesInfo)
{
    if(requiredFields.Contains(item.Name))
        {
            //Do your operation here
        }
}

在PropertyInfo的帮助下,您可以检查属性名称、属性类型、GetSetMethod()

更多详情:PropertyInfo Class

【讨论】:

  • 这应该是一个评论,如果你希望它是一个答案,那么考虑发布相关代码
  • 它没有做要求的事情,要求是根据 requiredFlields 中存在的值创建一个新列表
  • 新列表是什么?新的 propertyInfo 列表?您的主要问题在 Linq 中无法访问 requiredField list,对吗?如果我遗漏任何东西,请纠正我
  • 输出应该是一个属性较少的新列表,新列表中的属性定义为 requiredFlields List
  • 您可以存储包含requiredFields 中可用属性的List&lt;PropertyInfo&gt;,不确定是否将properties 存储到列表中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 2021-08-10
  • 1970-01-01
  • 2015-11-28
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多