Ho un'utilità di serializzazione delle stringhe che accetta una variabile di (quasi) qualsiasi tipo e la converte in una stringa. Quindi, ad esempio, secondo la mia convenzione, un valore intero di 123 sarebbe serializzato come "i: 3: 123" (i = intero; 3 = lunghezza della stringa; 123 = valore).Come faccio a sapere se un oggetto è una collezione generica e quali tipi contiene?
L'utilità gestisce tutti i tipi primitivi, nonché alcune raccolte non generiche, come ArrayList e Hashtables. L'interfaccia è di forma
public static string StringSerialize(object o) {}
internamente io rilevare che tipo è l'oggetto e serializzare conseguenza.
Ora voglio aggiornare la mia utilità per gestire raccolte generiche. La cosa divertente è che non riesco a trovare una funzione appropriata per rilevare che l'oggetto è una raccolta generica e che tipi contiene: entrambe le informazioni necessarie per la serializzazione corretta. Fino ad oggi ho usato la codifica della forma
if (o is int) {// do something}
ma questo non sembra funzionare con i generici.
Che cosa mi consiglia?
EDIT: Grazie a Lucero, ho ottenuto più vicino alla risposta, ma mi sono bloccato in questo piccolo enigma sintattica qui:
if (t.IsGenericType) {
if (typeof(List<>) == t.GetGenericTypeDefinition()) {
Type lt = t.GetGenericArguments()[0];
List<lt> x = (List<lt>)o;
stringifyList(x);
}
}
Questo codice non si compila, perché " lt
"non è consentito come argomento <T>
di un oggetto List<>
. Perchè no? E qual è la sintassi corretta?
Non puoi usare perché le sue informazioni sul tipo di runtime, non compilare il tempo .. (che usi generici), perché vuoi anche creare un elenco generico in questo modo comunque? sembra molto inutile. – meandmycode
http://stackoverflow.com/questions/266115/pass-an-instantiated-systemtype-as-a-type-parameter-for-a-generic-class - ecco come devi fare questo se davvero vuoi andare in questo modo, ma secondo me potrebbe mancare il punto di generici. – meandmycode
@meandmycode: è perfettamente normale per il codice di utilità di serializzazione. –