将通用方法与不同类型/类的列表一起使用

我正在尝试为List构建搜索function。 这很简单,但是我想要一个方法,它可以采用不同类型的列表。 以下面的示例来清除问题:

SearchGridViewCategorie和SearchGridViewMedewerker方法都是搜索List的方法,如果它包含搜索词。

public static void SearchGridViewMedewerker(ref List medewerkers, String term) { medewerkers = medewerkers.Where(m => m.gebruikersnaam.ToLower().Contains(term.ToLower()) || m.naam.ToLower().Contains(term.ToLower()) || m.email.ToLower().Contains(term.ToLower()) || m.rol.ToLower().Contains(term.ToLower())).ToList(); } public static void SearchGridViewCategorie(ref List categorieen, String term) { categorieen = categorieen.Where(c => c.omschrijving.ToLower().Contains(term.ToLower())).ToList(); } 

我试图使这个搜索方法通用,以便我可以将不同类型的列表传递给相同的方法。 我尝试过以下方法:

 public static List SearchGridView(List list, String term) { IList properties = list.GetType().GetProperties().ToList(); List tempList = new List(); foreach(object o in list){ foreach (var property in properties) { if (property.ToString().Contains(term.ToLower())) { tempList.Add(o); } } } return tempList; } 

但是,使用此解决方案,我必须在方法中传递List之前将类型T的List转换为对象列表。

那不是我想要的。 我想传递任何类型的List,处理它并返回作为参数给出的类型的List。 这可能吗?

我认为这就是你的意思:

 public static IList SearchGridView(IList list, String term) { IList properties = typeof(T).GetProperties(); var t = term.ToLower(); return list .Where(item => properties .Select(p => p.GetValue(item).ToString()) .Any(v => v.Contains(t))) .ToList(); } 

看起来你正试图简化这种性质的代码:

 x => x.property.ToLower().Contains(term.ToLower()) 

其中property是字符串属性, term是您要搜索的文本。 如果是这样,您可以使用LINQ扩展方法执行此操作:

 public static class Extensions { public static IEnumerable WhereTextInProperties(this IEnumerable source, string searchText, params Func[] getPropertyValues) { searchText = searchText.ToLowerInvariant(); return from element in source from getPropertyValue in getPropertyValues let propertyValue = getPropertyValue(element) where propertyValue.ToLowerInvariant().Contains(searchText) select element; } } 

然后你会像这样使用它:

 return medewerkers.WhereTextInProperties(term, m => m.gebruikersnaam, m => m.naam, m => m.email, m => m.rol ); 

您可以通过各种不同的方式(正则表达式,表达式列表而不是函数委托等)来改进它,但它可能作为一个起点。