Как использовать Reflection для вызова перегруженного метода в .NET - PullRequest
65 голосов
/ 22 октября 2008

Есть ли способ вызвать перегруженный метод, используя отражение в .NET (2.0). У меня есть приложение, которое динамически создает экземпляры классов, которые были получены из общего базового класса. В целях совместимости этот базовый класс содержит 2 метода с одинаковым именем, один с параметрами и один без. Мне нужно вызвать метод без параметров через метод Invoke. Прямо сейчас все, что я получаю, это ошибка, сообщающая мне, что я пытаюсь вызвать неоднозначный метод.

Да, я мог бы просто привести объект в качестве экземпляра моего базового класса и вызвать нужный мне метод. В конце концов, что произойдет , но сейчас внутренние осложнения этого не допустят.

Любая помощь будет отличной! Спасибо.

Ответы [ 3 ]

106 голосов
/ 22 октября 2008

Вы должны указать, какой метод вы хотите:

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]);
16 голосов
/ 22 октября 2008

Да. Когда вы вызываете метод, передайте параметры, которые соответствуют требуемой перегрузке.

Например:

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), будьте осторожны, чтобы получить правильный вариант - перегрузка без параметров может быть первой найденной.

5 голосов
/ 22 октября 2008

Используйте перегрузку GetMethod, которая принимает System.Type [], и передайте пустой тип [];

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