2008-10-21 109 views
55

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

是的,我可能只是将对象作为我的基类的一个实例,并调用我需要的方法。最终会发生,但现在,内部复杂化将不会允许它。

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

回答

89

你必须指定要哪一种方法:

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

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

例如:

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)要小心,你会得到正确的 - 无参数超载可能是第一个找到。

+0

有趣的是,这并不工作。我没有传入任何参数给我的无参数方法,而且我仍然有一个模糊的调用。 – 2008-10-21 21:08:34

+0

这是如何与不同类型的参数一起工作的?假设我有两个重载,一个接受一个字符串,另一个接受一个int? – smaclell 2008-10-21 21:10:51

+0

没有问题 - 参数的基础类型是检查的内容。 – Keith 2008-10-21 21:11:48

5

使用带有System.Type []的GetMethod重载,并传递一个空的Type [];

typeof (Class).GetMethod ("Method", new Type [ 0 ] { }).Invoke (instance, null); 
相关问题