リフレクションを使用して.NETでオーバーロードされたメソッドを呼び出す方法

StackOverflow https://stackoverflow.com/questions/223495

質問

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

はい、オブジェクトを基本クラスのインスタンスとしてキャストし、必要なメソッドを呼び出すだけです 。最終的には 発生しますが、現時点では、内部の合併症はそれを許可しません。

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

役に立ちましたか?

解決

必要なメソッドを指定する必要があります:

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]);

他のヒント

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

たとえば:

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を呼び出すこと)、正しいものを取得するように注意してください-パラメーターなしのオーバーロードが最初に見つかる可能性があります。

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

typeof ( Class ).GetMethod ( "Method", new Type [ 0 ] { } ).Invoke ( instance, null );
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top