Linq表达式返回第一个带有1个字符串参数的重载方法

时间:2010-01-28 20:12:28

标签: c# linq reflection

我将使用什么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 个答案:

答案 0 :(得分:9)

您可以通过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();

答案 1 :(得分:3)

这样的事情:

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)
{
    ...
}

通常情况下, 不能使用单个字符串参数多个方法,但如果你正在查看隐藏了一个字符串参数的派生类,那么就会发生具有正确参数列表和名称的基类方法。在那一点上,我不认为它会指定你首先得到哪种方法......

答案 2 :(得分:0)

我会将此添加为对Mehrdad的优秀答案的评论,但不要认为它的格式正确...

深入嵌套的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();

仍然让我的大脑受伤 - 但不是那么多。