在.NET (2.0)中,有没有一种使用反射调用重载方法的方式。我的应用程序动态实例化从一个通用基类派生的类。出于兼容性考虑,这个基类包含了两个同名方法,一个带参数,一个不带参数。我需要通过Invoke方法调用不带参数的方法。目前,我得到的只是一个错误提示,告诉我正在尝试调用一个模棱两可的方法。
是的,我可以将对象强制转换为我的基类的实例,并调用我需要的方法。最终这样做是可以的, 但是现在由于内部复杂性的原因我不能这样做。
任何帮助都将是非常感谢的!谢谢。
在.NET (2.0)中,有没有一种使用反射调用重载方法的方式。我的应用程序动态实例化从一个通用基类派生的类。出于兼容性考虑,这个基类包含了两个同名方法,一个带参数,一个不带参数。我需要通过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)进行操作,请注意获取正确的结果-无参数重载可能是第一个找到的。
typeof ( Class ).GetMethod ( "Method", new Type [ 0 ] { } ).Invoke ( instance, null );