2014-01-03 2 views
8

я сделать запрос на MethodInfo[] где я пытаюсь найти все методы, которые имеют тип возврата void, и имеет только один параметр в определенного типа. Я хочу сделать это самым минималистичным и самым коротким способом.Сократите этот запрос LINQ с помощью анонимного типа?

Один из способов сделать это будет:

var validMethods = methods.Where(m => m.ReturnType == typeof(void) && m.GetParameters().Length == 1 && m.GetParameters()[0].ParameterType == wantedType); 

или

var validMethods = methods 
     .Where(m => m.ReturnType == typeof(void)) 
     .Where(m.GetParameters().Length == 1 && m.GetParameters()[0].ParameterType == wantedType); 

Но есть резервный GetParameters вызов - один вызов должен быть достаточно. Так я думал, что я мог бы кэшировать, что анонимный тип, как так:

var validMethods = methods 
    .Where(m => m.ReturnType == typeof(void)) 
    .Select(m => new { Params = m.GetParameters() }) 
    .Where(p => p.Length == 1 && p[0].ParameterType == transition.eventType); 

Но это не сработало, я получил ошибки говоря, что это не Length ни индексатор для анонимного типа p, который имеет тип ParameterInfo[]

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

Спасибо за любую помощь :)

ответ

11

С синтаксисом запросов можно ввести новый переменный диапазон, которая будет содержать метод параметры

from m methods.Where(m => m.ReturnType == typeof(void)) 
let p = m.GetParameters() 
where p.Length == 1 && p[0].ParameterType == wantedType 
select m 

синтаксис метода не то, что красив:

methods.Where(m => m.ReturnType == typeof(void)) 
     .Select(m => new { m, p = m.GetParameters() }) 
     .Where(x => x.p.Length == 1 && x.p[0].ParameterType == wantedType) 
     .Select(x => x.m); 
+0

Спасибо. Как я могу использовать это в другом (точечном) синтаксисе? – vexe

+0

@vexe добавил образец с синтаксисом метода и анонимным типом –

+2

Спасибо :) - Btw Я исправил длину в моем Q, это должно быть 1 вместо 0. – vexe

2

Я согласен с Сергеем Березовским, что метод синтаксис он показал меньше, чем прекрасный д синтаксис uery. Но синтаксис метода можно переписать следующим образом:

methods.Where(IsTheRightMethod); 

и обычный метод:

private bool IsTheRightMethod(MethodInfo methodInfo) 
{ 
    if (methodInfo.ReturnType != typeof(void)) return false; 
    var parameters = methodInfo.GetParameters(); 
    return parameters.Length == 1 && parameters[0].ParameterType == typeof(wantedType); 
} 

ОП хотел короткое решение. Если это мало, зависит от того, как вы на это смотрите. Запрос Linq короче, а анонимные типы не создаются.

Это решение также облегчает отладку, а также упрощается расширение. Примером последнего может быть:

methods.Where(m => IsTheRightMethod(m, typeof(wantedType), 1)); 

и

private bool IsTheRightMethod(MethodInfo methodInfo, Type parametertype, int parametersLenght) 
{ 
    if (methodInfo.ReturnType != typeof(void)) return false; 
    var parameters = methodInfo.GetParameters(); 
    return parameters.Length == parametersLenght && 
      parameters.All(p => p.ParameterType == parametertype); 
} 
+0

Спасибо за ваше дополнение , Да, это также возможно :) Btw это должно быть 'ReturnType! = Typeof (void)' – vexe

+0

@vexe Вы правы, я изменил его на ReturnType! = Typeof (void) –

Смежные вопросы