Linq + Reflection通过字段名称和条件从列表中获取元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linq + Reflection通过字段名称和条件从列表中获取元素相关的知识,希望对你有一定的参考价值。

我有这样的课:

class SomeClass
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Age { get; set; }
    public DateTime Birthdate { get; set; }
}

我需要在列表中搜索满足条件的所有元素,例如。名称=='%th'

//Field name in this example can be:  "Id" , "Name" , "Age" ,"Birthdate"
List<SomeClass> Function(string fieldName, string searchedInfo)
{
    return list.Select(x => (fieldObtainedUsingReflection).Value.ToString().Contains(searchedInfo)).ToList();
}

我知道我可以这样做:

    switch(fieldName)
    {
      case "Id" : 
                 return list.Select(x=>x.Id.ToString().Contains(searchedInfo)).ToList(); 
      case "Name" :
                 return list.Select(x => x.Name.Contains(searchedInfo)).ToList();
     //.....

    }

但我想知道是否还有另一个更通用的实现。

使用LINQ和Reflection可以做到这一点吗?

如果可能的话,如果列表具有平均值,那么时间成本是多少。 30k元素?

谢谢

答案

如评论中所述,您可以使用Expression,如下所示:

 public static List<SomeClass> SearchBy(this IEnumerable<SomeClass> items, Expression<Func<SomeClass, bool>> predicate)
        {
           return items.AsQueryable().Where(predicate).ToList();
        }

然后你就可以这样使用:

        var list = new List<SomeClass>();

        var result= list.SearchBy(x => x.Name.Contains("x"));

以上是关于Linq + Reflection通过字段名称和条件从列表中获取元素的主要内容,如果未能解决你的问题,请参考以下文章

使用 Linq 、 Reflection 、 lambda 表达式系统地将 SqlParameters 添加到 SqlParameterCollection

在 linq 查询中设置动态排序名称字段

Go语言之reflection

改变字段的值

linq 组查询中的产品销售数量和名称

Go - reflection