2010-01-28 16 views
3

我將使用什麼Linq表達式來選擇接受單個字符串參數的第一個重載方法?Linq表達式返回需要1個字符串參數的第一個重載方法

例如返回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(); 

回答

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(); 
+0

我喜歡它 - 可以很好地擴展到更多的參數類型來檢查。 – 2010-01-28 20:20:30

+0

謝謝,我可以看到這將如何允許其他參數序列。 – QSmienk 2010-01-28 20:57:46

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

一般情況下不可能有比一個方法與單一字符串參數多,但它可以發生,如果你正在尋找一個派生類,它隱藏了一個基類方法,其中包含正確的參數列表和名稱。在這一點上,我不認爲這是指定的,你會得到哪一種方法,雖然第一...

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(); 

仍然讓我的大腦受到傷害 - 但不是那麼多。

相關問題