7

特定の属性を持つメソッドを呼び出したい。そのため、すべてのアセンブリとすべてのメソッドを循環して、自分の属性を持つメソッドを見つけています。正常に動作しますが、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
        }
    }
}

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

4

3 に答える 3

11

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

静的にできないと仮定すると、必要なコードは次のようになります。

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

            MethodInfo[] methods = t.GetMethods();
            foreach (MethodInfo method in methods)
            {                    
                method.Invoke(instance, params...);    
            }
    }
于 2009-05-28T08:43:43.227 に答える
5

これは、コーディングではなく、問題の定義という点で問題だと思います。

インスタンス メソッドは、呼び出されるインスタンスに依存します。何に対して呼び出されるかを気にせずにインスタンス メソッドを呼び出すのは意味がありません。(Martin が言うように、どのインスタンスで呼び出されているかを気にしないインスタンス メソッドは、ほとんどの場合、静的でなければなりません。これについて私が考えることができる唯一の差し迫った例外は、インスタンスが使用する実装を暗黙的に指定する仮想メソッドです。)

注釈付きのインスタンス メソッドが存在することがコンテキストで実際に何を意味するのかを理解してください。とにかくメソッドを呼び出そうとしているのはなぜですか?全体像は?どのようなコンテキストがありますか? コンテキスト (インスタンス メソッドを呼び出すことができるオブジェクトのコレクション) の概念が必要になると強く思います。

于 2009-05-28T08:50:49.500 に答える
0

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

于 2012-03-17T12:29:09.397 に答える