有没有一种方法可以在.NET(2.0)中使用反射调用重载方法。我有一个应用程序动态实例化已从一个公共基类派生的类。出于兼容的目的,这个基类包含两个同名的方法,一个带有参数,另一个没有。我需要通过Invoke方法调用无参数方法。现在,我得到的只是一个错误,告诉我我试图调用一个模糊的方法。如何使用反射来调用.NET中的重载方法
是的,我可能只是将对象作为我的基类的一个实例,并调用我需要的方法。最终会发生,但现在,内部复杂化将不会允许它。
任何帮助将是伟大的!谢谢。
有没有一种方法可以在.NET(2.0)中使用反射调用重载方法。我有一个应用程序动态实例化已从一个公共基类派生的类。出于兼容的目的,这个基类包含两个同名的方法,一个带有参数,另一个没有。我需要通过Invoke方法调用无参数方法。现在,我得到的只是一个错误,告诉我我试图调用一个模糊的方法。如何使用反射来调用.NET中的重载方法
是的,我可能只是将对象作为我的基类的一个实例,并调用我需要的方法。最终会发生,但现在,内部复杂化将不会允许它。
任何帮助将是伟大的!谢谢。
你必须指定要哪一种方法:
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并调用调用IE)要小心,你会得到正确的 - 无参数超载可能是第一个找到。
使用带有System.Type []的GetMethod重载,并传递一个空的Type [];
typeof (Class).GetMethod ("Method", new Type [ 0 ] { }).Invoke (instance, null);
有趣的是,这并不工作。我没有传入任何参数给我的无参数方法,而且我仍然有一个模糊的调用。 – 2008-10-21 21:08:34
这是如何与不同类型的参数一起工作的?假设我有两个重载,一个接受一个字符串,另一个接受一个int? – smaclell 2008-10-21 21:10:51
没有问题 - 参数的基础类型是检查的内容。 – Keith 2008-10-21 21:11:48