2016-05-03 110 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