2011-01-27 4 views
8

私はランタイムアセンブリの読み込みを行っていますが、クラスやメソッドの名前はわかりません。私は、System.Objectから継承したクラスではなく、宣言されたメソッドを使用して、私のアセンブリ内のすべてのクラスをリストすることを望んでいませんでした。ランタイムアセンブリの読み込み時に、宣言されたメソッドのみを見つける方法を教えてください。

これはコードです:

string str = ""; 
Assembly assembly = Assembly.LoadFile(@"c:\components.dll");  

foreach (Type type in assembly.GetTypes()) 
{ 
    if (type.IsClass == true) 
    {  
     str += type.Name + "\n";  
     MethodInfo[] methodInfo = type.GetMethods(BindingFlags.DeclaredOnly); 

     foreach (MethodInfo mi in methodInfo) 
     {  
      str += "\t" + mi.Name + "\n";  
     }  
    } 
} 

MessageBox.Show(str); 

これはcomponents.dllです:

public class component01 
{  
    public string myName = "component01"; 
    public string getMyName() 
    { 
     return myName; 
    } 
} 

public class component02 
{  
    public string myName = "component02"; 

    public string getMyName() 
    { 
     return myName; 
    } 
} 

結果:

component01 
component02 

And if i remove the bindingflag: 

component01 
    getMyName 
    ToString 
    Equals 
    GetHashcode 
    GetType 
component02 
    getMyName 
    ToString 
    Equals 
    GetHashcode 
    GetType 

私だけ示さgetMyName方法をしたいです。

答えて

9

私はあなたが旗を探していると思う:

BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly 

あなたはあなたの要件に応じて、同様BindingFlags.NonPublicに置きたいと思うことがあります。

より深い継承階層では、タイプがSystem.Object以外の基底型からメンバーを継承できることも指摘します。あなたがそれらを維持したいが、ないものは、もともとobjectで宣言した場合は、可能性:

  1. GetMethodsコールのためにBindingFlags.DeclaredOnlyフラグを削除します。 「宣言」のあなたの定義は方法がより複雑にした場合は、別のフィルタが必要になる場合があり、もちろん

    methodInfo.GetBaseDefinition().DeclaringType != typeof(object) 
    

  • のみのための方法が含まれます。

  • +1

    完璧に動作します、ありがとう!以前はPublicとDeclaredOnlyの両方を使ってみましたが、これはうまくいきませんでした。どのように私は3つすべてを指定する必要がありますか? – Bildsoe

    +0

    @Bildsoe: 'System.Reflection.BindingFlags'はフラグenumです。 'Instance'フラグがセットされていないとき、' GetMethods'はインスタンスメソッドを含みません。 – Ani

    +1

    よろしくお願いいたします。私はちょうどその方法が記載されていれば、それが含まれると思った。 – Bildsoe

    関連する問題