Question

Existe-t-il un moyen d'invoquer une méthode surchargée à l'aide de la réflexion dans .NET (2.0). J'ai une application qui instancie dynamiquement les classes dérivées d'une classe de base commune. Pour des raisons de compatibilité, cette classe de base contient 2 méthodes du même nom, une avec des paramètres et une sans. J'ai besoin d'appeler la méthode sans paramètre via la méthode Invoke. Pour le moment, tout ce que je reçois est une erreur en me disant que j'essaye d'appeler une méthode ambiguë.

Oui, je pourrais simplement transtyper l'objet en tant qu'instance de ma classe de base et appeler la méthode dont j'ai besoin. Cela finira par arriver, mais pour le moment, les complications internes ne le permettront pas.

Toute aide serait géniale! Merci.

Était-ce utile?

La solution

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

Autres conseils

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 en sens inverse (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.

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

typeof ( Class ).GetMethod ( "Method", new Type [ 0 ] { } ).Invoke ( instance, null );
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top