Я решил это, получив только типы объектов из пространства имен System, затем преобразовал их в словарь и затем добавил их в список. Работает хорошо для меня:)
Это выглядит сложно, но это было единственное общее решение, которое сработало для меня ...
Я использую эту логику для помощника, которого я создаю, поэтому он предназначен для специального использования, где мне нужно иметь возможность перехватывать каждый тип объекта в объекте сущности, может быть, кто-то может адаптировать его к его использованию.
List<Dictionary<string, string>> outputData = new List<Dictionary<string, string>>();
// convert all items to objects
var data = Data.ToArray().Cast<object>().ToArray();
// get info about objects; and get only those we need
// this will remove circular references and other stuff we don't need
PropertyInfo[] objInfos = data[0].GetType().GetProperties();
foreach (PropertyInfo info in objInfos) {
switch (info.PropertyType.Namespace)
{
// all types that are in "System" namespace should be OK
case "System":
propeties.Add(info.Name);
break;
}
}
Dictionary<string, string> rowsData = null;
foreach (object obj in data) {
rowsData = new Dictionary<string, string>();
Type objType = obj.GetType();
foreach (string propertyName in propeties)
{
//if You don't need to intercept every object type You could just call .ToString(), and remove other code
PropertyInfo info = objType.GetProperty(propertyName);
switch(info.PropertyType.FullName)
{
case "System.String":
var colData = info.GetValue(obj, null);
rowsData.Add(propertyName, colData != null ? colData.ToString() : String.Empty);
break;
//here You can add more variable types if you need so (like int and so on...)
}
}
outputData .Add(rowsData); // add a new row
}
«outputData» безопасен для кодирования JSON ...
Надеюсь, кто-то найдет это решение полезным. Было весело писать это:)