2016-05-03 68 views
0

请找到对这个问题重视小提琴Link转换对象字典用点符号

我想要做的是将对象转换为一个字典 物体看起来像这样

var person = new Person 
{ 
    FirstName = "Jon", 
    LastName = "Doe", 
    Address = new Address 
    { 
     Street = "Melkbos", 
     PostalCode = 90210 
    } 
}; 

而且所需的输出应该是这样的

{ 
{"FirstName", "Jon"}, 
{"LastName", "Doe"}, 
{"Address.Street", "Melkbos"}, 
{"Address.PostalCode", 90210}, 
}; 

因此,如果对象是嵌套我想有一个点号

+0

你问是否有一些内置的即时消息方法可以自动执行此操作? – glenebob

+0

反射选项? – smoksnes

+0

@glenebob,如果有一个内置的方式,将是伟大的,但我不认为有,因此扩展方法。 – R4nc1d

回答

3

您需要使用递归和测试你想要的属性的类型序列化。我修改了部分代码,使用IsSerializable。您可能需要调整这个以满足您的需求:

public static IDictionary<string, T> ToDictionary<T>(this object source) 
{ 
    if (source == null) 
     ThrowExceptionWhenSourceArgumentIsNull(); 

    var dictionary = new Dictionary<string, T>(); 
    AddPropertiesToDictionary(new List<string>(), source, dictionary); 
    return dictionary; 
} 

private static void AddPropertiesToDictionary<T>(IList<string> path, object source, IDictionary<string, T> dictionary) 
{ 
    foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(source)) 
    { 
     var value = property.GetValue(source); 
     if (IsOfType<T>(value)) 
     { 
      if (property.PropertyType.IsSerializable) { 
       dictionary.Add((path.Any() ? string.Join(".", path) + "." : "") + property.Name, (T)value); 
      } 
      else 
      { 
       path.Add(property.Name); 
       AddPropertiesToDictionary(path, value, dictionary); 
      } 
     } 
    } 
} 

输出是:

Key    Value 
FirstName   Jon 
LastName   Doe 
Address.Street  Melkbos 
Address.PostalCode 90210 

您应该可以修改这个让你花括号和引号在那里很容易地。

0

我想反射是没有必要的,因为你知道属性的名称,你可以试试这个:

namespace personToDictionary 
{ 
    public class Person 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public Address Address { get; set; } 

     public Dictionary<string, string> ToDictionary() 
     { 
      return new Dictionary<string, string> 
      { 
       {"FirstName", FirstName}, 
       {"LastName", LastName}, 
       {"Address.Street", Address.Street}, 
       {"Adress.PostalCode", Address.PostalCode.ToString()} 
      }; 
     } 
    } 

    public class Address 
    { 
     public string Street { get; set; } 
     public int PostalCode { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var person = new Person 
      { 
       FirstName = "Jon", 
       LastName = "Doe", 
       Address = new Address 
       { 
        Street = "Melkbos", 
        PostalCode = 90210 
       } 
      }; 
      var personDictionary = person.ToDictionary(); 
     } 
    } 
} 

希望它可以帮助

+0

而不是“名字”,你可以使用nameof(FirstName) - 假设你在c#6上 – Derek