Tengo una utilidad de serialización de cadenas que toma una variable de (casi) cualquier tipo y la convierte en una cadena. Así, por ejemplo, según mi convención, un valor entero de 123 se serializaría como "i: 3: 123" (i = entero, 3 = longitud de cadena; 123 = valor).¿Cómo puedo detectar que un objeto es una colección genérica y qué tipos contiene?
La utilidad maneja todo tipo primitivo, así como algunas colecciones no genéricas, como ArrayLists y Hashtables. La interfaz es de la forma
public static string StringSerialize(object o) {}
e internamente detecto lo que escriba el objeto es serializar y que en consecuencia.
Ahora quiero actualizar mi utilidad para manejar colecciones genéricas. Lo curioso es que no puedo encontrar una función apropiada para detectar que el objeto es una colección genérica, y qué tipos contiene: las dos piezas de información que necesito para serializarla correctamente. Hasta la fecha he estado utilizando la codificación de la forma
if (o is int) {// do something}
pero eso no parece funcionar con los genéricos.
¿Qué me recomiendas?
EDIT: Gracias a Lucero, he llegado más cerca de la respuesta, pero estoy atascado en este pequeño enigma sintáctica aquí:
if (t.IsGenericType) {
if (typeof(List<>) == t.GetGenericTypeDefinition()) {
Type lt = t.GetGenericArguments()[0];
List<lt> x = (List<lt>)o;
stringifyList(x);
}
}
Este código no compila, porque " lt
"no está permitido como el argumento <T>
de un objeto List<>
. Por qué no? ¿Y cuál es la sintaxis correcta?
No se puede usar lt porque es información del tipo de tiempo de ejecución, no de compilación ... ¿qué genéricos se utilizan? ¿Por qué incluso se desea crear una lista genérica de esta manera? parece muy sin sentido. – meandmycode
http://stackoverflow.com/questions/266115/pass-an-instantiated-systemtype-as-a-type-parameter-for-a-generic-class - así es como necesitas hacer esto si REALMENTE quieres ir de esta manera, pero para mí creo que puede estar perdiendo el sentido de los genéricos. – meandmycode
@meandmycode - es perfectamente normal para el código de la utilidad de serialización. –