Я пытаюсь преобразовать объект в ExpandoObject.C# получить свойства и свойства дочерних полей recursivly
До сих пор у меня есть массивы обоих свойств и полей,
Type type = data.GetType();
FieldInfo[] fields = type.GetFields();
PropertyInfo[] props = type.GetProperties();
можно легко пройти через реквизита и получить значение каждого из них, а также добавить, что в моей ExpandoObject:
public static ExpandoObject ConvertToExpandoObject(object data)
{
var dynObj = new ExpandoObject();
Type type = data.GetType();
FieldInfo[] fields = type.GetFields();
PropertyInfo[] props = type.GetProperties();
// first the properties...
foreach (var property in props)
{
// add this property
((IDictionary<string, object>)dynObj).Add(property.Name, property.GetValue(data,null));
}
}
Но тогда для каждого поля я хочу вызвать метод новообращенного снова, таким образом:
foreach (var field in fields)
{
// add this field
((IDictionary<string, object>)dynObj).Add(field.Name,ConvertToExpandoObject(field?? as an object));
}
Как я не знаю тип поля, о котором идет речь, хотя он находится в field.FieldType, как мне перейти на преобразование поля в объект своего типа, чтобы перейти в функцию преобразования?
EDIT:
Полный текст в один блок, мы надеемся сделать его более ясным:
public static ExpandoObject ConvertToExpandoObject(object data)
{
var dynObj = new ExpandoObject();
Type type = data.GetType();
FieldInfo[] fields = type.GetFields();
PropertyInfo[] props = type.GetProperties();
// first the properties...
foreach (var property in props)
{
// add this property
((IDictionary<string, object>)dynObj).Add(property.Name, property.GetValue(data,null));
}
foreach (var field in fields)
{
// add this field
((IDictionary<string, object>)dynObj).Add(field.Name,ConvertToExpandoObject(field?? as an object));
}
}
EDIT 2:
Пример объектов - они тривиальны. Это может быть академическим теперь, как я могу легко предвидеть, когда они не были бы ... мог бы вернуться к чертежной доске
class Parent
{
public string parentVar { get; set; }
public Child child { get; set; }
}
class Child
{
public string childvar { get; set; }
}
Почему вы хотите, чтобы преобразовать значения поля в 'ExpandoObject 'оставляют значения свойств такими, какие они есть? – dymanoid
Запахи * действительно * рыбный. Вы либо добавляете значение поля as-is, либо расширяете его до ExpandoObject, вы не можете обойти оба. Также довольно непонятно, почему вы делаете это для поля, но не для свойства, мало смысла. Я подозреваю, что вы столкнетесь с множеством проблем, когда попытаетесь использовать возвращаемый объект ExpandoObject, если объект нетривиальен. –
Возможно, я не объясню это правильно. У меня есть объект, который имел только свойства и преобразовывал его в ExpandoObject - все было хорошо. Тогда в ходе вещей у меня появился другой объект, который имел не только свойства, но и дочерние объекты (поля?), Каждый из которых необходимо преобразовать в объект ExpandoObject и добавить в качестве дочернего элемента вывода ExpandoObject – Morvael