2009-05-28 7 views
7

特定の属性を持つメソッドを呼び出そうとしています。 したがって、私のアトリビュートを持つメソッドを見つけるために、すべてのアセンブリとすべてのメソッドを循環させています。うまく動作しますが、MethodInfoしかない場合は、特定のメソッドを呼び出す方法を教えてください。MethodInfoでメソッドを呼び出す

AppDomain app = AppDomain.CurrentDomain; 
Assembly[] ass = app.GetAssemblies(); 
Type[] types; 
foreach (Assembly a in ass) 
{ 
    types = a.GetTypes(); 
    foreach (Type t in types) 
    { 
     MethodInfo[] methods = t.GetMethods(); 
     foreach (MethodInfo method in methods) 
     { 
      // Invoke a certain method 
     } 
    } 
} 

問題は、特定のメソッドを含むクラスのインスタンスがわからないということです。メソッドが静的ではないので、私は正しく呼び出すことができません。 可能であれば、このクラスの新しいインスタンスを作成しないようにしたいと考えています。

答えて

5

これは、問題定義の面で問題ではなく、コーディングとして私を打ちます。

インスタンスメソッドは、それらが上で呼び出されていたインスタンスに依存して - それは上と呼ばれるものを気にすることなく、インスタンスメソッドを呼び出すためにも意味がありません。 (マーティンの言うとおり、どのインスタンスが呼び出されているか気にしないインスタンスメソッドは、ほとんど常に静的でなければなりません。インスタンスのメソッドは、インスタンスが暗黙的に使用する実装を指定する仮想メソッドです。

注釈付きインスタンスメソッドがあるため、実際に何を試してみるかを意味します。とにかくメソッドを呼び出そうとしているのはなぜですか?より大きな写真は何ですか?どんなコンテキストがありますか?私は強くあなたがコンテキストのいくつかの概念を望んでいることを疑う - のインスタンスメソッドを呼び出すオブジェクトのコレクション。

+0

私がしたいのは、メソッドをコマンドラインで呼び出し可能にするカスタム属性でマークすることです。彼らがどこにいても。しかし、メソッドが静的でないサーバーインスタンスで同じメソッドを呼び出すことは意味がないと私は同意します。 これを、ある種類のマネージャークラスで使用します。このクラスには、パラメータごとに特定のインスタンスで呼び出しを呼び出すためのこれらのオブジェクトのコレクションが含まれています。これが私の望むことをすると思う。ありがとう – apparat

11

非静的メソッドはインスタンス固有のため、メソッドを呼び出すためにクラスをインスタンス化する必要があります。コードが定義されている場所でコードを変更することができ、そのメソッドがインスタンスの一部である必要がない(クラス内の非静的なプロパティやメソッドにアクセスまたは変更しない)場合、ベストプラクティスはとにかくメソッドを静的にすること。次のようにあなたはそれが静的作ることができないと仮定すると、

は、あなたが必要なコードは次のとおりです。

foreach (Type t in types) 
    { 
      object instance = Activator.CreateInstance(t); 

      MethodInfo[] methods = t.GetMethods(); 
      foreach (MethodInfo method in methods) 
      {      
       method.Invoke(instance, params...);  
      } 
    } 
+0

実際には;非静的メソッドは**インスタンス**固有です。静的メソッドはクラス固有です。 – Kris

+0

おっと。編集されました - ありがとう。 –

0

実際には、既存のオブジェクトのリストを作成してリストを検索するだけです。したがって、これらの呼び出し可能オブジェクトを作成するときには、それらをリストに格納します(または、リストは呼び出し可能オブジェクトの説明も含む他の種類のオブジェクトのリストである必要があります)。次に、実行時にリストをスキャンし、処理しているイベントのタイプに一致するものを探し、methodInfoを調べ、メソッド情報について.Invokeを呼び出します。また、適切な引数を渡す必要がありますが、正しい型のオブジェクトのベクトルを作成することでそれを行うことができます。

関連する問題