How to use Reflection to Invoke an Overloaded Method in .NET
Is there a way to Invoke an overloaded method using reflection in .NET (2.0). I have an application that dynamically instantiates classes that have been derived from a common base class. For compatibility purposes, this base class contains 2 methods of the same name, one with parameters, and one without. I need to call the parameterless method via the Invoke method. Right now, all I get is an error telling me that I'm trying to call an ambiguous method.
Yes, I could just cast the object as an instance of my base class and call the method I need. Eventually that will happen, but right now, internal complications will not allow it.
Any help would be great! Thanks.
You have to specify which method you want:
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]);
Yes. When you invoke the method pass the parameters that match the overload that you want.
For instance:
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 } );
If you do this the other way round(i.e. by finding the MemberInfo and calling Invoke) be careful that you get the right one - the parameter-free overload could be the first found.
Use the GetMethod overload that takes a System.Type[], and pass an empty Type[];
typeof ( Class ).GetMethod ( "Method", new Type [ 0 ] { } ).Invoke ( instance, null );