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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

有没有办法在.NET(2.0)中使用反射来调用重载方法。我有一个应用程序动态实例化已从一个公共基类派生的类。出于兼容的目的,这个基类包含2个同名的方法,一个带有参数,另一个没有。我需要通过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),要小心你得到的是正确的 - 无参数的重载可能是第一个找到的。

扫码关注云+社区