Nota del autor

Si la entrada que estás leyendo carece de imágenes, no se ve el vídeo que teóricamente lleva incrustado o el código fuente mostrado aparece sin formato, podéis conocer los motivos aquí. Poco a poco iré restableciendo la normalidad en el blog.
Este blog es un archivo de los artículos situados previamente en Lobosoft.es y ha dejado de ser actualizado. Las nuevas entradas pueden encontrarse en www.lobosoft.es. Un saludo,
Lobosoft.

miércoles, 30 de mayo de 2012

Interfaz universal

Cuando en un diseño las interfaces crecen en complejidad tanto como incertidumbre poseen los requisitos del desarrollo que se va a acometer, llega un punto en el que se pueden representar mediante la «interfaz universal»:

    public interface IUniversal
    {
        object Action(object param);
    }

En ese momento, es posible demostrar que se está caminando por el filo de la navaja por el método de la reducción al absurdo.

viernes, 25 de mayo de 2012

Reflexionando sobre genéricos

Ha llovido mucho desde que el Microsoft incorporase los genéricos en su .NET Framework . Fue en la versión 2.0, a finales del año 2005, y aunque sus beneficios se dejaron notar desde el primer momento entre la comunidad de desarrolladores y a día de hoy se usan con total normalidad, en ocasiones tenemos que pedirles “un poco más”. Por ejemplo, cuando el tipo de dato genérico no es conocido en tiempo de compilación y tenemos que inferirlo durante la ejecución de la aplicación.

Aunque no descubro nada bueno aquí, me he decidido a recuperar para el blog algunas de esas microentradas que antaño aparecían por aquí, buscando imprimir de nuevo un ritmo de publicaciones adecuado. Como hace poco tuve que usar técnicas de reflexión sobre genéricos y comprobé que apenas hay literatura en castellano sobre el tema, aquí van unas píldoras para ver cómo podríamos realizar algunas operaciones muy concretas en la situación que he descrito en el párrafo anterior.

Crear una clase genérica dinámicamente a partir de un objeto

Es muy sencillo usar una clase genérica y crear objetos de un determinado tipo en tiempo de compilación. Por ejemplo, si tenemos la clase
public class Data<T>
{
   public T Value { getset; }
}
podemos crear un objeto que contenga un entero simplemente así:
Data<int> data = new Data<int>();
data.Value = 1;
Para crear una clase genérica en tiempo de ejecución, esto es, sin definirla en el código durante la compilación, tendremos que jugar un poco con los tipos en .NET y con la clase Activator, que nos permite instanciar dinámicamente un objeto a partir de un tipo determinado. Así, podríamos conseguir crear un Data dinámicamente con el siguiente código:
Type dataType = typeof(Data<>);
Type genericType = dataType.MakeGenericType(value.GetType());
genClassesArray.Add(Activator.CreateInstance(genericType));

 

Obtener el tipo anidado de una clase genérica

Puede ocurrir que uno de nuestros métodos reciba un parámetro con un tipo dinámico (por ejemplo, un List) y queramos saber el tipo del dato genérico anidado. Esto se consigue con facilidad:
Type nestedType = value.GetType().GetGenericArguments()[0];

 

Llamar a un método genérico con el tipo de un dato obtenido en tiempo de ejecución

Por último, podríamos tener un método genérico y desear llamarlo dinámicamente, sin saber a priori el tipo anidado que estamos gestionando en esa ejecución de nuestro código. Por ejemplo, el siguiente método:
public Data<T> GetDataWithValue<T>(string stringValue)
{
return new Data<T>() { Value = (T)Convert.ChangeType(stringValue, typeof(T)) };
}
realiza una conversión (un casting) del valor recibido como string al tipo que se le indica y devuelve un tipo genérico Data con el valor indicado (pero con su tipo correspondiente). Para realizar la llamada sin conocer a priori el tipo T, tendremos que usar, ahora sí, objetos MethodInfo que se incluyen dentro de System.Reflection e invocar la llamada al método en cuestión. El uso de Convert.ChangeType() que vemos en el ejemplo es necesario al encontrarnos ante un valor expresado como una cadena de caracteres.

Podemos conseguir realizar la llamada dinámicamente, por ejemplo, así:
MethodInfo method = typeof(MyClassDemo).GetMethod("GetDataWithValue");
MethodInfo genericMethod = method.MakeGenericMethod(value.GetType());
var result = genericMethod.Invoke(thisnew object[] { value.ToString() });
Vemos que tendríamos que obtener el método a invocar del tipo que lo contiene (en este caso, una clase llamada MyClassDemo) y crear un método dinámico referido al tipo del objeto value que hemos recibido. A continuación, lo invocaríamos pasándole los parámetros en un array de objetos y con un primer parámetro que será nulo si el método es estático o el objeto del tipo MyClassDemo que realiza la llamada en caso contrario. En el ejemplo en cuestión se especifica el this porque se trata de una llamada a un método de la propia clase en la que estamos realizando las pruebas.

Y poco más. Como veis, a la potencia de los genéricos se le puede sacar mucho más partido si «reflexionamos» un poco sobre ellos. ;)

martes, 22 de mayo de 2012

Journal of Feelsynapsis n.º 4





Aunque últimamente estoy desaparecido y apenas he publicado en el blog (aunque el uso del plural aquí sería más correcto, ya que tengo todos prácticamente paralizados), lo cierto es que tengo ganas de retomar la escritura por aquí y espero que el verano sea un periodo fructífero en este sentido. Entretanto, y para no olvidar las buenas costumbres, os dejo uno de los últimos artículos que he publicado en Journal of Feelsynapsis, una revista de divulgación científica que no os podéis (debéis) perder. Este sí que trata sobre informática y podéis encontrarlo en el n.º 4 de esta publicación. Su título, "Lenguajes esotéricos... de programación".

Eso sí, una vez que lo terminéis, pensad que el resto de la revista es infinitamente mejor. Así que si os gustó, corred a seguir leyéndola, y en el hipotético caso de que no fuese así leedla también porque, como os digo, los demás artículos no desmerecen la cuidada edición que les acoge y os van a encantar a buen seguro.

Feliz lectura.

martes, 1 de mayo de 2012

1 de mayo

Siempre es buena la capacidad de reírse de uno mismo. El Día del Trabajo homenajeado desde la comedia en el mundillo informático.