77

.NET (2.0) でリフレクションを使用してオーバーロードされたメソッドを呼び出す方法はありますか。共通の基本クラスから派生したクラスを動的にインスタンス化するアプリケーションがあります。互換性のために、この基本クラスには同じ名前の 2 つのメソッドが含まれています。1 つはパラメーター付きで、もう 1 つはパラメーターなしです。Invoke メソッドを介してパラメーターなしのメソッドを呼び出す必要があります。現在、あいまいなメソッドを呼び出そうとしていることを知らせるエラーだけが表示されます。

はい、オブジェクトを基本クラスのインスタンスとしてキャストし、必要なメソッドを呼び出すことができます。最終的にはそうなるでしょうが、今は内部の複雑さがそれを許しません。

どんな助けでも素晴らしいでしょう!ありがとう。

4

3 に答える 3

126

必要な方法を指定する必要があります。

class SomeType 
{
    void Foo(int size, string bar) { }
    void Foo() { }
}

SomeType obj = new SomeType();
// call with int and string arguments
obj.GetType()
    .GetMethod("Foo", new Type[] { typeof(int), typeof(string) })
    .Invoke(obj, new object[] { 42, "Hello" });
// call without arguments
obj.GetType()
    .GetMethod("Foo", new Type[0])
    .Invoke(obj, new object[0]);
于 2008-10-21T21:10:55.980 に答える
17

はい。メソッドを呼び出すときに、必要なオーバーロードに一致するパラメーターを渡します。

例えば:

Type tp = myInstance.GetType();

//call parameter-free overload
tp.InvokeMember( "methodName", BindingFlags.InvokeMethod, 
   Type.DefaultBinder, myInstance, new object[0] );

//call parameter-ed overload
tp.InvokeMember( "methodName", BindingFlags.InvokeMethod, 
   Type.DefaultBinder, myInstance, new { param1, param2 } );

これを逆に行う場合 (つまり、MemberInfo を見つけて Invoke を呼び出す)、正しいものを取得するように注意してください。パラメーターのないオーバーロードが最初に見つかる可能性があります。

于 2008-10-21T21:05:23.197 に答える
5

System.Type[] を受け取る GetMethod オーバーロードを使用し、空の Type[] を渡します。

typeof ( Class ).GetMethod ( "Method", new Type [ 0 ] { } ).Invoke ( instance, null );
于 2008-10-21T21:09:32.270 に答える