C# 动态Linq包含用于筛选列表的

C# 动态Linq包含用于筛选列表的,c#,linq,oop,generics,dynamic,C#,Linq,Oop,Generics,Dynamic,我有这个方法 public static IEnumerable<T> Filter<T>(IEnumerable<T> source, string searchStr) { var propsToCheck = typeof(T).GetProperties().Where(a => a.PropertyType == typeof(string)); var filter = propsToCheck.Aggregate(stri

我有这个方法

public static IEnumerable<T> Filter<T>(IEnumerable<T> source, string searchStr)
{
    var propsToCheck = typeof(T).GetProperties().Where(a => a.PropertyType == typeof(string));

    var filter = propsToCheck.Aggregate(string.Empty, (s, p) => (s == string.Empty ? string.Empty : string.Format("{0} OR ", s)) + string.Format("{0} == @0", p.Name).ToLower());

    var filtered = source.AsQueryable().Where(filter, searchStr);
    return filtered;
}
公共静态IEnumerable筛选器(IEnumerable源代码,字符串searchStr)
{
var propsToCheck=typeof(T).GetProperties(),其中(a=>a.PropertyType==typeof(string));
var filter=propsToCheck.Aggregate(string.Empty,(s,p)=>(s==string.Empty?string.Empty:string.Format(“{0}或”,s))+string.Format(“{0}==@0”,p.Name).ToLower());
var filtered=source.AsQueryable()。其中(filter,searchStr);
返回过滤;
}

它获取列表和搜索字符串,并在列表中查找任何匹配项。但是,这只适用于100%匹配,如何使其不区分大小写并使用contains而不是100%匹配?

构建动态LINQ查询看起来不是最佳选择。使用代理进行筛选会更好:

public static IEnumerable<T> Filter<T>(IEnumerable<T> source, string searchStr)
{
  var searchStrLower = searchStr.ToLower();
  var propsToCheck = typeof(T).GetProperties().Where(a => a.PropertyType == typeof(string) && a.CanRead);

  return source.Where(obj => {
    foreach (PropertyInfo prop in propsToCheck)
    {
      string value = (string)prop.GetValue(obj);
      if (value != null && value.ToLower().Contains(searchStrLower)) return true;
    }
    return false;
  });
}
公共静态IEnumerable筛选器(IEnumerable源代码,字符串searchStr)
{
var searchStrLower=searchStr.ToLower();
var propsToCheck=typeof(T).GetProperties(),其中(a=>a.PropertyType==typeof(string)&&a.CanRead);
返回源。其中(obj=>{
foreach(PropertyInfo prop in propsToCheck)
{
字符串值=(字符串)prop.GetValue(obj);
如果(value!=null&&value.ToLower().Contains(searchStrLower))返回true;
}
返回false;
});
}

所以基本上只需要过滤那些包含给定字符串的字符串?不,假设我传递一个对象列表,其中一个属性是countries,它的值为Australia和Australia。因此,当我发送带有搜索字符串“Aus”的方法时,它返回包含两个国家的列表。它是在列表中搜索,遍历所有字段,并返回任何属性包含给定字符串的对象。我还需要它是不区分大小写的,它应该适用于任何类型的对象?(顺便说一句,你不能在泛型函数中使用typeof(t)。或者你问题中的代码实际上是这样工作的?)是的,基本上我想创建一个方法,我传入一个对象列表和一个搜索字符串,它动态地计算出对象的属性,并发回一个包含字符串的对象列表。这是一个通用方法,可以获取任何对象的列表。此外,对象的某些属性可以为null,这也是我目前遇到的问题。代码目前也可以工作,但仅限于100%匹配,并且区分大小写。我使用动态LINQ非常好,谢谢你,先生,我欠你一个人情。说真的,我已经为这件事挠头一个星期了。非常感谢。