Jak użyć Reflection do wywołania przeciążonej metody in.NET

Czy istnieje sposób na wywołanie przeciążonej metody używając reflection w. NET (2.0). Mam aplikację, która dynamicznie tworzy instancje klas, które zostały wyprowadzone ze wspólnej klasy bazowej. Dla celów kompatybilności, Ta klasa bazowa zawiera 2 metody o tej samej nazwie, jedną z parametrami i jedną bez. Muszę wywołać metodę bez parametru za pomocą metody Invoke. W tej chwili dostaję tylko błąd, który mówi mi, że próbuję nazwać niejednoznaczną metodę.

Tak, Ja Może po prostu oddać obiekt jako instancję mojej klasy bazowej i wywołać metodę, której potrzebuję. W końcu to się stanie, ale teraz wewnętrzne komplikacje na to nie pozwolą.

Każda pomoc byłaby świetna! Dzięki.

Author: Cheeso, 2008-10-22

3 answers

Musisz określić, którą metodę chcesz:

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]);
 99
Author: Hallgrim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-21 23:55:30

Tak. Po wywołaniu metody przekaż parametry, które pasują do przeciążenia, które chcesz.

Na przykład:

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 } );

Jeśli zrobisz to odwrotnie (np. znajdując Membinfo i wywołując Invoke) bądź ostrożny, aby uzyskać właściwy-przeciążenie bez parametrów może być pierwszym znalezionym.

 16
Author: Keith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-21 21:10:49

Użyj przeciążenia GetMethod, które zajmuje System.Type [], and pass an empty Type [];

typeof ( Class ).GetMethod ( "Method", new Type [ 0 ] { } ).Invoke ( instance, null );
 5
Author: baretta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-21 21:09:32