2016-11-11 6 views
0

Я пытаюсь преобразовать объект в 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; } 
} 
+0

Почему вы хотите, чтобы преобразовать значения поля в 'ExpandoObject 'оставляют значения свойств такими, какие они есть? – dymanoid

+0

Запахи * действительно * рыбный. Вы либо добавляете значение поля as-is, либо расширяете его до ExpandoObject, вы не можете обойти оба. Также довольно непонятно, почему вы делаете это для поля, но не для свойства, мало смысла. Я подозреваю, что вы столкнетесь с множеством проблем, когда попытаетесь использовать возвращаемый объект ExpandoObject, если объект нетривиальен. –

+0

Возможно, я не объясню это правильно. У меня есть объект, который имел только свойства и преобразовывал его в ExpandoObject - все было хорошо. Тогда в ходе вещей у меня появился другой объект, который имел не только свойства, но и дочерние объекты (поля?), Каждый из которых необходимо преобразовать в объект ExpandoObject и добавить в качестве дочернего элемента вывода ExpandoObject – Morvael

ответ

0

Я смотрел на это с другой точки зрения, Конечной целью была преобразовать в ExpandoObject перед его сериализацией для отправки веб-клиенту. Это так свойства могут быть удалены на основе авторизации пользователей ..

Так что я просто сериализовать его первым, а затем удалены свойства ..

ExpandoObject dynObj = JsonConvert.DeserializeObject<ExpandoObject>(JsonConvert.SerializeObject(data)); 

 Смежные вопросы

  • Нет связанных вопросов^_^