Appeler une méthode private d'une classe internal à partir d'une autre assembly

Description

La reflection offre des possibilités immenses ! Dans certains cas on aimerais bien appeller des méthodes private / internal contenus dans une autres assembly, généralement dans le framework.

Malheureusement par définition une classe internal ne peut pas être appellé en dehors de son assembly.

Voici alors une astuce utilisant la reflection qui nous permet d'appeller une méthode private d'une classe internal d'un autre assembly.

La solution joint dans le zip se compose de 2 projets : une application console et un projet Class Library, dans le class Library j'ai une class internal avec une méthode private. Dans l'application console j'appelle cette méthode private :-)

Source / Exemple :


static void Main(string[] args)
        {

            // On récupere le type qui nous intéresse 
            Type t = Type.GetType("ClassLibrary2.Toto, ClassLibrary2");

            // On récupere le constructeur de l'objet qui ne demande aucun paramètre
            ConstructorInfo constructor = t.GetConstructor(Type.EmptyTypes);

            // On appelle le constructeur de l'objet avec aucun paramètre
            Object obj = constructor.Invoke(null) ;

            // On obtient notre méthode Hello 
            // Reflector nous indique que c'est une méthode d'instance private donc on filtre notre recherche
            MethodInfo method = t.GetMethod("Hello" , BindingFlags.Instance | BindingFlags.NonPublic); 

            // On appelle la méthode avec aucun paramètre mais en passant l'objet auquel est rattaché la méthode 
            String result = (String)method.Invoke(obj, null);

            // On affiche le résultat 
            Console.WriteLine(result);
            Console.Read();
        }

Conclusion :


Cet exemple ne sert qu'a vous montrez les possibilités de la reflection, il existe beaucoup de variantes à cette méthode, je vous laisse découvrir les joies de la reflection par vous même :)

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.