Как я могу отфильтровать список, используя обобщенные методы и методы расширения Linq? - PullRequest
2 голосов
/ 29 июня 2011

Я пытаюсь написать общий метод расширения фильтра для системы, чтобы я мог вызвать фильтр для любого списка и передать словарь имен полей и их значений для фильтрации.

В настоящее время у меня есть метод для каждого типа в моей системе, но я пытаюсь объединить в один метод.

Вот что я до сих пор ... упростила, так что это только поиск текста:

public static List<T> Filter<T>(this List<T> model, string json)
    {
        JavaScriptSerializer ser = new JavaScriptSerializer();
        Dictionary<string, object> searchFields = (Dictionary<string, object>)ser.DeserializeObject(json);

        foreach (var key in searchFields.Keys)
        {               
            // How do I perform the search?               
        }

        return model;
    }

Мой текущий фильтр является оператором переключения для каждой клавиши и проверяет каждое поле следующим образом:

switch(key) 
{
    case "Description":
        list = list.Where(x => x.Description.ToLower().Contains(searchFields[key].ToString().ToLower())).ToList();
                    break;
}

Как получить доступ к свойству универсального объекта для его фильтрации? Я предполагаю, что мне нужно как-то размышление, но я не знаю синтаксис.

Я ищу что-то вроде:

list = list.where(listobject.getField(key).contains(value))

Возможно ли это? Заранее спасибо за помощь!

Ответы [ 2 ]

6 голосов
/ 29 июня 2011

попробуйте что-то подобное внутри вашей foreach петли

 model.Where(m => typeof(T).GetProperty(key).GetValue(m, null)==searchFields[key]);
0 голосов
/ 29 июня 2011
foreach (var key in searchFields.Keys)
{               
    model.Where(m => typeof(T).GetProperty(key).GetValue(m, null).Equals(SearchFields[key], StringComparison.OrdianlIgnoreCase);         
}

return model.ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...