382 votes

Comment puis-je utiliser la réflexion pour invoquer une méthode privée?

Il y a un groupe privé de méthodes de ma classe, et j'ai besoin d'appeler une façon dynamique, en fonction d'une valeur d'entrée. À la fois l'invocation de code et les méthodes cible sont dans la même instance. Le code ressemble à ceci:

MethodInfo dynMethod = this.GetType().GetMethod("Draw_" + itemType);
dynMethod.Invoke(this, new object[] { methodParams });

Dans ce cas, GetMethod() ne sera pas de retour des méthodes privées. Ce BindingFlags dois-je fournir à l' GetMethod() afin qu'il puisse rechercher des méthodes privées?

595voto

wprl Points 6139

Simplement modifier votre code pour utiliser la surcharge version de GetMethod qui accepte BindingFlags:

MethodInfo dynMethod = this.GetType().GetMethod("Draw_" + itemType, BindingFlags.NonPublic | BindingFlags.Instance);
dynMethod.Invoke(this, new object[] { methodParams });

Voici l' énumération BindingFlags de la documentation.

~ William Riley-Terre

75voto

Jeromy Irvine Points 5308

BindingFlags.NonPublic ne vous donnera pas de résultats par lui-même. Comme il s'avère, en les combinant avec d' BindingFlags.Instance fait le tour.

MethodInfo dynMethod = this.GetType().GetMethod("Draw_" + itemType, 
    BindingFlags.NonPublic | BindingFlags.Instance);

9voto

Bill K Points 32115

Êtes-vous absolument sûr que cela ne peut pas être fait par le biais de l'héritage? La réflexion est la dernière chose que vous devriez regarder lors de la résolution d'un problème, il rend le refactoring, la compréhension de votre code, et tout automatisé d'analyse de plus en plus difficile.

Il semble que vous devriez juste avoir un DrawItem1, DrawItem2, etc classe qui remplacent votre dynMethod.

2voto

Peter Hession Points 186

Ne pourriez-vous pas juste une autre méthode de Tirage pour chaque type que vous voulez Dessiner? Appelez ensuite la surcharge la méthode de Tirage de passage dans l'objet de type itemType à tirer.

Votre question n'est pas clairement si itemType véritablement se réfère à des objets de types différents.

-1voto

Khoth Points 7001

BindingFlags.NonPublic

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