Как использовать отражение для вызова перегруженного метода в .NET

StackOverflow https://stackoverflow.com/questions/223495

Вопрос

Есть ли способ вызвать перегруженный метод, используя отражение в .NET (2.0).У меня есть приложение, которое динамически создает экземпляры классов, которые были производными от общего базового класса.В целях совместимости этот базовый класс содержит 2 метода с одинаковыми именами, один с параметрами, а другой без.Мне нужно вызвать метод без параметров через метод 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), будьте осторожны, чтобы получить правильный - перегрузка без параметров может быть первой найденной.

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

typeof ( Class ).GetMethod ( "Method", new Type [ 0 ] { } ).Invoke ( instance, null );
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top