2015-02-04 2 views
1

Как преобразовать словарь в класс и подклассы рекурсивно? Это мои классы:Конвертировать словарь <string, object> в класс и подкласс

public class UiItem 
{ 
    public string id { get; set; } 
    public string text { get; set; } 
    public Rect rect { get; set; } 
} 

public class Rect 
{ 
    public int height { get; set; } 
    public int width { get; set; } 
    public int y { get; set; } 
    public int x { get; set; } 
} 

Я написал это, но я не знаю, как создать объект Rect в классе UiItem:

public static T GetObject<T>(this Dictionary<string, object> dict) 
    { 
     Type type = typeof(T); 
     var obj = Activator.CreateInstance(type); 

     foreach (var kv in dict) 
     { 
      var prop = type.GetProperty(kv.Key); 
      object value = kv.Value; 
      if (kv.Value.GetType() == typeof(Dictionary<string, object>)) 
      { 
       value = GetObject<_???_>((Dictionary<string, object>) value) // <= This line 
      } 

      if(prop == null) continue; 
      prop.SetValue(obj, value, null); 
     } 
     return (T)obj; 
    } 
+0

ли Ваша структура объекта 'n' уровней вложенности? Если это всего лишь 2 уровня, то почему бы не взять 2 типа параметров? – user1620220

ответ

2

Самый простой способ сделать это, чтобы передать тип, как вместо использования общего метода. Это потом:

public static Object GetObject(this Dictionary<string, object> dict, Type type) 
    { 
     var obj = Activator.CreateInstance(type); 

     foreach (var kv in dict) 
     { 
      var prop = type.GetProperty(kv.Key); 
      if(prop == null) continue; 

      object value = kv.Value; 
      if (value is Dictionary<string, object>) 
      { 
       value = GetObject((Dictionary<string, object>) value, prop.PropertyType); // <= This line 
      } 

      prop.SetValue(obj, value, null); 
     } 
     return obj; 
    } 

Вы можете создать общую версию, которая выполняет отливку:

public static T GetObject<T>(this Dictionary<string, object> dict) 
{ 
    return (T)GetObject(dict, typeof(T)); 
} 
+0

О, это здорово! Спасибо... – Artyom

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