Выражение Linq для возврата первого перегруженного метода, который принимает 1 строковый параметр - PullRequest
3 голосов
/ 28 января 2010

Какое выражение Linq я бы использовал для выбора первого перегруженного метода, который принимает один строковый параметр?

Например, чтобы вернуть DateTime.ToString (строковый формат) вместо DateTime.ToString (поставщик IFormatProvider).

t = typeof(DateTime);
string[] validMethods = { "ToString" };
return t.GetMethods().Where(a => validMethods.Contains(a.Name) & a.GetParameters().Length == 1).ToArray();

Ответы [ 3 ]

9 голосов
/ 28 января 2010

Вы можете проверить весь список параметров с помощью вызова SequenceEqual:

t = typeof(DateTime);
string[] validMethods = { "ToString" };
Type[] parameters = { typeof(string) };
return t.GetMethods()
        .Where(a => validMethods.Contains(a.Name) &&
                    a.GetParameters().Select(p => p.ParameterType)
                                     .SequenceEqual(parameters)).ToArray();
3 голосов
/ 28 января 2010

Примерно так:

var match = (from method in type.GetMethods()
             where validMethods.Contains(method.Name)
             let parameters = method.GetParameters()
             where parameters.Length == 1
             where parameters[0].ParameterType == typeof(string)
             select method).FirstOrDefault();

if (match != null)
{
    ...
}

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

0 голосов
/ 29 января 2010

Я бы добавил это как комментарий к отличному ответу Мехрдада, но не думаю, что он правильно отформатировал бы ...

Глядя на глубоко вложенные выражения LINQ, у меня болит мозг (вероятно, потому, что я новичок в LINQ).

Вот моя попытка переформатировать его более читабельным способом.

     var t = typeof(DateTime);
     string[] validMethods = { "ToString" };
     var parameters = new[] { typeof(string) };

     return t.GetMethods()
             .Where
             (
                a => validMethods.Contains(a.Name)
                     && 
                     a.GetParameters()
                      .Select(p => p.ParameterType)
                      .SequenceEqual(parameters)
             )
             .ToArray();

Все еще причиняет боль моему мозгу, но не так сильно.

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