У меня есть утилита сериализации строк, которая берет переменную (почти) любого типа и преобразует ее в строку. Так, например, согласно моему соглашению, целочисленное значение 123 будет сериализовано как «i: 3: 123» (i = целое число; 3 = длина строки; 123 = значение).
Утилита обрабатывает все примитивные типы, а также некоторые неуниверсальные коллекции, такие как ArrayLists и Hashtables. Интерфейс имеет вид
public static string StringSerialize(object o) {}
и внутренне я определяю тип объекта и сериализую его соответственно.
Теперь я хочу обновить мою утилиту для обработки общих коллекций. Самое смешное, что я не могу найти подходящую функцию для определения того, что объект является универсальной коллекцией и какие типы он содержит - какие именно фрагменты информации мне нужны для правильной сериализации. На сегодняшний день я использую кодирование вида
if (o is int) {// do something}
но, похоже, это не работает с генериками.
Что вы рекомендуете?
РЕДАКТИРОВАТЬ: Благодаря Lucero , я стал ближе к ответу, но я застрял в этой небольшой синтаксической головоломке здесь:
if (t.IsGenericType) {
if (typeof(List<>) == t.GetGenericTypeDefinition()) {
Type lt = t.GetGenericArguments()[0];
List<lt> x = (List<lt>)o;
stringifyList(x);
}
}
Этот код не компилируется, потому что "lt
" не допускается в качестве аргумента <T>
объекта List<>
. Почему бы и нет? И какой правильный синтаксис?