Invocar constructores genéricos por reflexión

Explicaré brevemente cómo se puede invocar un constructor genérico por reflexión (del namespace System.Reflection) dado que a veces solamente tenemos el Type del genérico y no se puede pasar entre dado que no es el nombre de una clase.
Para mi caso, es una acción de un método web que me pasa un string con el nombre de la entidad a procesar por lo que el proceso, que es un método genérico, no se podía llamar de este modo:

public void ProcessStuff(Type type, object data)
{
    var processor = new Processor(); // Esto da error

    var results = processor.process(data);
}

Entonces, esto es un problema ya que el método ProcessStuff en este caso no puede ser genérico, lo que solventaría así el problema:

public void ProcessStuff(object data)
{
    var processor = new Processor();

    var results = processor.process(data);
}

Así que el namespace System.Reflection viene en nuestra ayuda y el secreto está en el método MakeGenericType. El método final es algo así:

public void ProcessStuff(Type type, object data)
{
    var constructor = typeof(Processor).MakeGenericType(new[] { type }).GetConstructor(new Type[] {}); // Obtiene el constructor sin parámetros
    var processor = constructor.Invoke(new object[] { });

    var processMethod = processor.GetType().GetMethod("Process", new[] {typeof(object)}); // Obtiene el método del objeto creado
    var results = processMethod.Invoke(processor, new[] {data}); // Llama al método
}

Y eso es todo. Es un poco más engorroso, por supuesto, pero nos puede sacar de más de un lio y ahorrarnos un montón de switches.

Si te ha gustado esta entrada, por favor deja un comentario o suscríbete al RSS para que puedas recibir todas las novedades en tu lector de feeds favorito.
This entry was posted in Productividad and tagged , , . Bookmark the permalink.

Leave a reply