using System.Collections.Generic;
public static string NestedListToString<T>
string openingBracket = $"{(asArray ? "[" : "{")}{(indented ? $"\n{new string('\t', level)}" : "")}";
string closingBracket = $"{(indented ? $"\n{new string('\t', level - 1)}" : "")}{(asArray ? "]" : "}")}";
string joinSeparator = $",{(indented ? $"\n{new string('\t', level)}" : "")}";
if (typeof(T).IsValueType || typeof(T) == typeof(String))
return $"{(asArray ? "[" : "{")}{string.Join(',', nestedList)}{(asArray ? "]" : "}")}";
else if (typeof(T).IsNested)
return $"{openingBracket}{string.Join(joinSeparator, nestedList.Select(i => JsonSerializer.Serialize(i)))}{closingBracket}";
var nestedListString = string.Join(joinSeparator,
nestedList.Select(nl => typeof(Program)
.GetMethod("NestedListToString")
.MakeGenericMethod(typeof(T).GetGenericArguments()[0])
.Invoke(null, new object[] { nl, asArray, indented, level + 1 })).ToList());
return $"{openingBracket}{nestedListString}{closingBracket}";
public int Member1 { get; set; }
public string Member2 { get; set; }
public static void Main()
var list1 = new List<int>() {1,2,3};
var list2 = new List<int>() {4,5,6};
var nestedList1a = new List<List<int>>() {list1, list2};
var nestedList1b = new List<List<int>>() {list2, list1};
var nestedList2 = new List<List<List<int>>>() {nestedList1a, nestedList1b};
Console.WriteLine(NestedListToString(nestedList2, false, true));
var list3 = new List<string>() {"abc","def","ghi"};
Console.WriteLine(NestedListToString(list3, true));
var list4 = new List<decimal>() {1.2m,3.5m,4.75m};
Console.WriteLine(NestedListToString(list4));
var list5 = new List<bool>() {true, false};
Console.WriteLine(NestedListToString(list5));
var list6 = new List<char>() {'a', 'b', 'c'};
Console.WriteLine(NestedListToString(list6));
var list7 = new List<Class1> { new Class1 { Member1 = 12, Member2 = "xyz" } };
Console.WriteLine(NestedListToString(list7, true, true));