183 votos

¿Cómo se utiliza la reflexión para invocar un método privado?

Hay un grupo de métodos privados de mi clase, y tengo que llamar a una dinámica en función de un valor de entrada. Tanto el código que invoca y los métodos de destino están en la misma instancia. El código es el siguiente:

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

En este caso, GetMethod() no volverá métodos privados. ¿Qué BindingFlags necesito para suministrar a GetMethod() de modo que pueda localizar los métodos privados?

293voto

wprl Puntos 6139

Simplemente cambie el código para utilizar el sobrecargado versión de GetMethod que acepta BindingFlags:

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

Aquí está la documentación de la enumeración BindingFlags .

~ William Riley-Land

52voto

Jeromy Irvine Puntos 5308

BindingFlags.NonPublic no arrojó ningún resultado por sí mismo. Pues resulta que, combinándola con BindingFlags.Instance hace el truco.

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

10voto

Bill K Puntos 32115

¿Estás absolutamente seguro de que esto no se puede hacer a través de la herencia? La reflexión es la última cosa que usted debe buscar en la hora de resolver un problema, hace refactorización, la comprensión de su código, y cualquier análisis automatizado más difícil.

Parece que sólo debe tener un DrawItem1, DrawItem2, etc clase que anula su dynMethod.

2voto

Peter Hession Puntos 186

¿No podría simplemente tener un método Draw diferente para cada tipo que desea dibujar? A continuación, llame al método Draw sobrecargado pasando el objeto de tipo tipoElemento que se elaborará.

Su pregunta no deja claro si tipoElemento realmente se refiere a objetos de diferentes tipos.

1voto

Khoth Puntos 7001

BindingFlags.NonPublic

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X