« 7 Consejos para usar excepciones | Inicio | Web Services u Object Remoting »

Rompiendo las Reglas: : invocando métodos privado desde otra clase en C#

Las reglas de la programación orientada al objeto (OOP) dicen que no se puede llamar a un método privado de una clase.

De modo que si se tiene la siguiente clase:

class MiClase
{
   private void MetodoPrivado()
   {
      System.Console.WriteLine("método privado invocado");
   }
}

No es posible llamar al método MetodoPrivado desde otra clase, incluso desde una clase derivada.


Rompiendo las reglas

Pero en C# usando Reflection es posible saltar esta restricción, y llamar un método privado.

El siguiente código muestra cómo 

using System;

using System.Reflection;


public class PrivateCaller
{

   static void Main()
   {

     PrivateClass a = new PrivateClass();

     BindingFlags eFlags = BindingFlags.Instance

                 | BindingFlags.Public

                 | BindingFlags.NonPublic;

     MethodInfo m;

     try
     {

        m = t.GetMethod("PrivateMethod", eFlags);

        if (m != null)
        {

          m.Invoke(objInstance, aobjParams);

        }

    }

    catch
    {
       throw;
    }
  }
}


Por supuesto esto se puede evitar aplicando el atributo ReflectionPermission.

¿Para qué podría usarse esto?

Un uso interesante es cuando quieres hacer testing de clases, usando NUnit, por ejemplo, en ese caso puedes usar esto para probar métodos privados de una clase.

Otro uso es para invocar métodos de una clase a la cual no tienes acceso para modificarla. 

TrackBack

URL del Trackback para esta entrada:
http://www.lnds.net/cgi-bin/mt-tb.cgi/475

Publicar un comentario

(Si no dejó aquí ningún comentario anteriormente, quizás necesite aprobación por parte del dueño del sitio, antes de que el comentario aparezca. Hasta entonces, no se mostrará en la entrada. Gracias por su paciencia).

Buscar

Google
Web metodos