METHODINFOでメソッドを呼び出します
-
06-09-2019 - |
質問
私は、特定の属性を持つメソッドを呼び出すようにしたいです。 だから私は自分の属性を持つメソッドを見つけるために、すべてのアセンブリと、すべてのメソッドを巡回しています。正常に動作しますが、私はそれだけが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
}
}
}
問題は、私はその特定のメソッドを含むクラスのインスタンスを知らないということです。メソッドが静的ではありませんので、だから私はそれを正しく呼び出すことはできません。 私はまた、可能な場合は、このクラスの新しいインスタンスを作成しないようにしたい。
解決
この問題定義の面で問題ではなく、コーディングとして私を打つます。
インスタンスメソッドは、それらが上で呼び出されていたインスタンスに依存して - それは上と呼ばれるものを気にすることなく、インスタンスメソッドを呼び出すためにも意味がありません。 (マーティンが言うように、上でそれが呼ばれていたインスタンスを気にしないインスタンスメソッドは、ほとんど常に静的である必要があります。私は、これはインスタンスが暗黙的に使用する実装を指定する仮想メソッド、であるために考えることができる唯一の即時の例外。)
それは本当にをどのようなワークアウトの意味あなたの文脈における注釈付きインスタンスメソッドが存在することが。なぜあなたはとにかくメソッドを呼び出そうとしていますか?大きな画像は何ですか?あなたはどのような状況がありますか?私は強くあなたがコンテキストのいくつかの概念をお勧めします疑い - あなたがのオブジェクトのコレクションをは上のインスタンスメソッドを呼び出すことができます。
。他のヒント
非静的メソッドは、インスタンス固有です。あなたはそれが定義されているコードと方法を変更する機能を持っている場合は、インスタンスの一部であること自体を必要としません(それはクラス内の任意の非静的プロパティやメソッドにアクセスしたり、変更しない)、その後のベストプラクティスを希望とにかくこの方法は、静的にすること。
あなたは次のようにそれは、あなたが必要とするコードは、静的作ることができないと仮定します:
foreach (Type t in types)
{
object instance = Activator.CreateInstance(t);
MethodInfo[] methods = t.GetMethods();
foreach (MethodInfo method in methods)
{
method.Invoke(instance, params...);
}
}
実は、私はあなたが何をする必要があるかと思います、既存のオブジェクトのリストを作成し、リストを検索することです。あなたはこれらの呼び出し可能オブジェクトを作成するように、あなたはリストにそれらを格納します(あるいは、リストはまた、呼び出し可能なオブジェクトの説明を持っているいくつかの他の種類のオブジェクトのリストでなければなりません)。そして、あなたが処理しているイベントのタイプと一致するものを見つけ、実行時にリストをスキャンして、そのMETHODINFOを見て、あなたが何をしたいのthatsを想定し、法情報に.Invokeを呼び出すことができます。あなたはまた、適切な引数を渡す必要があるでしょうが、あなたは右のタイプのオブジェクトのベクトルを作成することによってそれを行うことができます。