Как использовать отражение для вызова перегруженного метода in.NET
есть ли способ вызвать перегруженный метод с помощью отражения в .NET (2.0). У меня есть приложение, которое динамически создает экземпляры классов, которые были получены из общего базового класса. В целях совместимости этот базовый класс содержит 2 метода с одинаковым именем, один с параметрами, а другой без. Мне нужно вызвать метод без параметров с помощью метода Invoke. Прямо сейчас, все, что я получаю, это ошибка, говорящая мне, что я пытаюсь вызвать неоднозначный метод.
Да, Я может просто приведите объект в качестве экземпляра моего базового класса и вызовите метод, который мне нужен. В конце концов, что будет бывает, но прямо сейчас, внутренние осложнения не позволят этого.
любая помощь будет здорово! Спасибо.
3 ответа:
вы должны указать, какой метод вы хотите:
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), будьте осторожны, чтобы вы получили правильный - перегрузка без параметров может быть первой найденной.