2011-12-19 12 views
1

私は反射と拡張方法

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

foundMethodsしか含まれています(String)メソッド理由を得る反射による方法を取得するために

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

しかし、不可能な文字列クラスに拡張メソッドを持っていますか?他のメソッドはどこにありますか?

+2

([拡張メソッドを識別するために、C#のリフレクション]の可能重複http://stackoverflow.com/questions/299515/c-sharp-reflection-to-identify:あなたは、コードを使用して取得することができ

-extension-methods) –

+0

[Reflection to Identify Extension Methods]の可能な複製(http://stackoverflow.com/questions/299515/reflection-to-identify-extension-methods) –

答えて

3

Stringクラスで宣言されたメソッドではないため、GetMethodsは表示されません。拡張メソッドが有効であるという事実は、それを宣言する名前空間がインポートされ、リフレクションがそのことについて何も知らないかどうかによって異なります。拡張はインスタンスメソッドのように見えるようにする構文的な砂糖を持つ静的メソッドに過ぎないことに留意してください。

1

質問に記載されている単純な反射方法を使用して拡張方法を見つけることはできません。

あなたはクラスやメソッドにExtensionAttributeを見て、最初のパラメータタイプは文字列であることを確認する必要があります。どのアセンブリでも拡張メソッドを定義できるので、目的のアセンブリに対してこれを行う必要があります

0

ContainsメソッドはStringクラスではないため、typeof(string).GetMethods()でContainsメソッドを取得できません。あなたは、コード

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;