@vanixachatryan

Как реализовать множественную фильтрацию OfType c LINQ?

Имеются методы у которых есть атрибуты, я пытаюсь найти рефлексией нужный мне метод по двум параметрам, каждый из которых отвечает за свой атрибут.

Как я могу добавить в запрос еще один .OfType<UpdateHandleAttribute>() (очевидно в тупую дописать так же но с другим типом не сработает) что бы при не возможности фильтрации по одному типу можно было фильтровать по второму?

то есть по итогу должно быть условие соответствующее двум атрибутам(значениям их полей), которые соответствуют условию Any().

var method = assembly
                .GetTypes()
                .SelectMany(t => t.GetMethods())
                .FirstOrDefault(y => y.GetCustomAttributes()
                    .OfType<UpdateHandleAttribute>()
                    .Any(v => (v.GetType().GetProperty("Data").GetValue(v).ToString() == data || 
                               v.GetType().GetProperty("Data").GetValue(v).ToString() == "*") 
                              && v.GetType().GetProperty("State").GetValue(v).ToString() == state.Id.ToString()));
  • Вопрос задан
  • 51 просмотр
Решения вопроса 1
@Ezekiel4
Охотник на пиратов и сборщик монолитов
Обратите внимание на метод Concat(). С его помощью можно красиво объединять результаты фильтрации.
var methods = assembly
    .GetTypes()
    .SelectMany(t => t.GetMethods())
    .Where(m => m.GetCustomAttributes().OfType<UpdateHandleAttribute>()
        .Any(v => (v.GetType().GetProperty("Data").GetValue(v).ToString() == data || 
            v.GetType().GetProperty("Data").GetValue(v).ToString() == "*") 
            && v.GetType().GetProperty("State").GetValue(v).ToString() == state.Id.ToString()))
    .Concat(assembly.GetTypes()
        .SelectMany(t => t.GetMethods())
        .Where(m => m.GetCustomAttributes().OfType<AnotherAttribute>().Any()));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы