如何使用反射调用.NET 中的重载方法

中的反射调用重载方法。NET (2.0).我有一个应用程序,可以动态实例化从公共基类派生的类。出于兼容性考虑,此基类包含两个同名方法,一个带参数,另一个不带参数。我需要通过 Invoke 方法调用无参数方法。现在,我得到的只是一个错误,告诉我我正试图调用一个模糊的方法。

是的,我 可以只是将对象强制转换为我的基类的实例,然后调用我需要的方法。最终发生 威尔,但现在,内部并发症将不允许它。

任何帮助将是巨大的! 谢谢。

34888 次浏览

是的。当您调用该方法时,传递与所需重载匹配的参数。

例如:

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

你必须指定你想要的方法:

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