69 votes

Comment utiliser Reflection pour invoquer une méthode surchargée dans .NET

Est-il possible d'Appeler une méthode surchargée à l'aide de réflexion .NET (2.0). J'ai une application dynamique qui instancie les classes qui ont été dérivées à partir d'une classe de base commune. Pour des raisons de compatibilité, cette classe de base contient 2 les méthodes de même nom, l'un avec des paramètres, et l'autre sans. J'ai besoin d'appeler la méthode sans paramètre via la méthode Invoke. Maintenant, tout ce que j'obtiens une erreur me disant que je suis en train d'appeler un ambigu de la méthode.

Oui, je pourrais jeter l'objet comme une instance de ma classe de base et l'appel à la méthode dont j'ai besoin. Finalement qui va arriver, mais pour l'instant, interne complications ne le permettra pas.

Toute aide serait super! Merci.

110voto

Hallgrim Points 7198

Vous devez spécifier quelle méthode vous voulez:

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

17voto

Keith Points 46288

Oui. Lorsque vous appelez la méthode, transmettez les paramètres correspondant à la surcharge souhaitée.

Par exemple:

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

Si vous faites cela dans l'autre sens (c'est-à-dire en recherchant MemberInfo et en appelant Invoke), veillez à obtenir le bon - la surcharge sans paramètre pourrait être la première trouvée.

5voto

baretta Points 4391

Utilisez la surcharge GetMethod qui prend un System.Type [] et transmettez un Type vide [];

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X