代码之家  ›  专栏  ›  技术社区  ›  QSmienk

Linq表达式,以返回第一个采用1个字符串参数的重载方法

  •  3
  • QSmienk  · 技术社区  · 15 年前

    例如,返回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 回复  |  直到 15 年前
        1
  •  9
  •   Mehrdad Afshari    15 年前

    您可以使用 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();
    
        2
  •  3
  •   Jon Skeet    15 年前

    大概是这样的:

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

    通常不会有 具有单个字符串参数的多个方法,但 可以 如果您正在查看一个派生类,该派生类隐藏了一个具有正确参数列表和名称的基类方法,则会发生这种情况。在这一点上,我不认为它的具体方法,你会得到第一,虽然。。。

        3
  •  0
  •   Tom Bushell    15 年前

    看着嵌套的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();