2012-02-09 111 views
35

現在我再解釋一下我對字典的渴望!從我的previous question回答我的腦海裏出現了這個問題!如何將類轉換爲Dictionary <string,string>?

現在的實際問題是我可以將Class轉換成Dictionary嗎?

在字典我想我的類屬性爲KEY和值特定財產作爲VALUE

假設我的課是

public class Location 
{ 
    public string city { get; set; } 
    public string state { get; set; } 
    public string country { get; set; 
} 

現在假設我的數據是

city = Delhi 
state = Delhi 
country = India 

現在你可以輕鬆理解我的觀點了!

我想製作字典!該字典應該像

我可以得到的價值!但是,我怎樣才能得到屬性名稱(不值)?

我該怎麼編碼來創建它動態!這應該適用於我想要的每個班級?

你可以理解這個問題作爲

我怎樣才能從特定的類屬性的列表?

+0

您可以嘗試重新提問嗎?我沒有真正想到你想要達到的目標。 – ilivewithian 2012-02-09 12:00:56

+0

Insort!我想要所有變量的特定類的名字!這可能嗎 ? – Chintan 2012-02-09 12:02:25

+0

@NoOne我已經回答了您,但您需要了解更多關於面向對象的內容。你在談論_properties_。類級別的「變量」稱爲_fields_。通過名稱來稱呼所有事情是很重要的,因爲理解你比以前更容易! ;) – 2012-02-09 12:06:13

回答

88

這是配方:1反射,1 LINQ到對象!

someObject.GetType() 
    .GetProperties(BindingFlags.Instance | BindingFlags.Public) 
      .ToDictionary(prop => prop.Name, prop => prop.GetValue(someObject, null)) 

自從我發表這個答案我已經籤很多人發現它是有用的。我邀請所有尋找這個簡單解決方案的人來檢查另一個Q & A,我將其推廣到一個擴展方法:Mapping object to dictionary and vice versa

+0

如果我看到像「GenericEqualityComparer」這樣的「內部」屬性,而不是我明確聲明的屬性,該怎麼辦?我試過'BindingFlags.DeclaredOnly'。 – drzaus 2012-07-17 15:43:29

+0

**更新**從來沒有 - 我發現使用這種反射(本身在一個對象擴展名)的方法最終調用自己的轉換結果,所以我的擴展名被調用的對象,然後在生成的字典上。 – drzaus 2012-07-17 15:54:41

+0

我不能在Unity3D中編譯這個,我是否缺少程序集引用? – c0d3Junk13 2013-12-10 19:10:40

13

這裏與反思的例子不LINQ:

Location local = new Location(); 
    local.city = "Lisbon"; 
    local.country = "Portugal"; 
    local.state = "None"; 

    PropertyInfo[] infos = local.GetType().GetProperties(); 

    Dictionary<string,string> dix = new Dictionary<string,string>(); 

    foreach (PropertyInfo info in infos) 
    { 
     dix.Add(info.Name, info.GetValue(local, null).ToString()); 
    } 

    foreach (string key in dix.Keys) 
    { 
     Console.WriteLine("nameProperty: {0}; value: {1}", key, dix[key]); 
    } 

    Console.Read(); 
+0

這節省了我至少一天的工作時間。非常感謝,如果可以的話,我會投你兩次! – Kibitz503 2012-11-29 21:54:10

0
protected string getExamTimeBlock(object dataItem) 
{ 
    var dt = ((System.Collections.Specialized.StringDictionary)(dataItem)); 

    if (SPContext.Current.Web.CurrencyLocaleID == 1033) return dt["en"]; 
    else return dt["sv"]; 
} 
0

試試這個。

public static Dictionary<string, object> ObjectToDictionary(object obj) 
    { 
     Dictionary<string, object> ret = new Dictionary<string, object>(); 

     foreach (PropertyInfo prop in obj.GetType().GetProperties()) 
     { 
      string propName = prop.Name; 
      var val = obj.GetType().GetProperty(propName).GetValue(obj, null); 
      if (val != null) 
      { 
       ret.Add(propName, val.ToString()); 
      } 
      else 
      { 
       ret.Add(propName, null); 
      } 
     } 

     return ret; 
    } 
0

我想添加反射的替代方法,使用JToken。您將需要檢查兩者之間的基準差異,以查看哪個具有更好的性能。

var location = new Location() { City = "London" }; 
var locationToken = JToken.FromObject(location); 
var locationObject = locationObject.Value<JObject>(); 
var locationPropertyList = locationObject.Properties() 
    .Select(x => new KeyValuePair<string, string>(x.Name, x.Value.ToString())); 

請注意,此方法最適合平面類結構。

+0

'var locationObject = locationObject.Value ();'? – 2018-02-28 04:01:15

相關問題