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


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

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

любая помощь будет здорово! Спасибо.

3 61

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

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

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