Как использовать Reflection для вызова перегруженного метода в .NET.
Есть ли способ вызвать перегруженный метод с использованием отражения в .NET(2.0). У меня есть приложение, которое динамически создает классы, которые были получены из общего базового класса. Для целей совместимости этот базовый класс содержит 2 метода с тем же именем, один с параметрами и один без него. Мне нужно вызвать метод без параметров через метод Invoke. Прямо сейчас, все, что я получаю, это ошибка, сообщающая мне, что я пытаюсь вызвать неоднозначный метод.
Да, я мог бы просто передать объект в качестве экземпляра моего базового класса и вызвать метод, в котором я нуждаюсь. В конечном счете это произойдет, но сейчас внутренние осложнения не позволят этого.
Любая помощь будет замечательной! Спасибо.
Ответы
Ответ 1
Вы должны указать, какой метод вы хотите:
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]);
Ответ 2
Да. Когда вы вызываете метод, передайте параметры, соответствующие нужной вам перегрузке.
Например:
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), будьте осторожны, чтобы вы получили правильный вариант: без перегрузки по параметрам может быть найден первый.
Ответ 3
Используйте перегрузку GetMethod, которая принимает System.Type [] и передает пустой тип [];
typeof ( Class ).GetMethod ( "Method", new Type [ 0 ] { } ).Invoke ( instance, null );