2011-12-19 105 views
1

我有串類反思與擴展方法

public static bool Contains(this string original, string value, StringComparison comparisionType) 
{ 
    return original.IndexOf(value, comparisionType) >= 0; 
} 

但不可能擴展方法通過反射來獲取的方法

IEnumerable<MethodInfo> foundMethods = from q in typeof(string).GetMethods() 
             where q.Name == "Contains" 
             select q; 

foundMethods僅獲得包含(string)方法,爲什麼?其他包含方法在哪裏?

+2

[C#反射來標識擴展方法(可能重複http://stackoverflow.com/questions/299515/c-sharp-reflection-to-identify -extension-methods) – 2011-12-19 14:09:16

+0

[Reflection to Identify Extension Methods]的可能重複(http://stackoverflow.com/questions/299515/reflection-to-identify-extension-methods) – 2017-04-13 14:35:00

回答

3

這不是在String類中聲明的方法,所以GetMethods看不到它。擴展方法在範圍內的事實取決於聲明它的名稱空間是否已導入,並且反射對此沒有任何瞭解。請記住,擴展只是靜態方法,語法糖使它看起來像是實例方法。

1

您不能使用問題中列出的簡單反射方法查找擴展方法。

你將不得不看ExtensionAttribute的類和方法,並驗證第一個參數類型爲字符串。由於作爲擴展方法可以在任何組件定義你將不得不感興趣

0

組件做到這一點你包含方法是不是在String類,因此,你不能獲得包含方法用typeof(串).GetMethods()。

爲了得到你需要,你可以使用代碼

public partial String 
{ 
    public static bool Contains(this string original, string value, StringComparison comparisionType) 
    { 
     return original.IndexOf(value, comparisionType) >= 0; 
    } 
} 

但代碼有,所以你不能使用此參數String類不能是靜態的問題是什麼。

所以你應該在任何靜態類中定義這個Contains方法。

您可以使用代碼獲取:

public static StringDemo 
    { 
     public static bool Contains(this string original, string value, StringComparison comparisionType) 
     { 
      return original.IndexOf(value, comparisionType) >= 0; 
     } 
    } 

IEnumerable<MethodInfo> foundMethods = from q in typeof(StringDemo).GetMethods() 
             where q.Name == "Contains" 
            select q;