2012-02-09 9 views
35

もう一度、私は辞書についての熱意の1つを説明しています!この質問は私のprevious questionの答えから私の心の中にポップアップされています!!クラスをDictionary <string、string>に変換する方法は?

実際のポイントはです。クラスを辞書に変換できますか?

値としてKEYおよび特定のプロパティの値として、私は私のクラスのプロパティをしたい辞書に

私のクラスは

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

+0

Insort!私はすべての変数の特定のクラスの名前が欲しい!これは可能ですか? – Chintan

+0

@NoOne私はあなたに答えましたが、あなたはOOPについてもっと知る必要があります。あなたは_properties_について話しています。そして、クラスレベルの "変数"は_fields_と呼ばれます。名前よりも簡単に理解できるように、すべてを呼び出すことが重要です! ;) –

答えて

88

これはレシピです:1反射、1 LINQ-to-Objects!

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

+0

** UPDATE ** nevermind - このリフレクション(オブジェクト拡張ではそれ自体)を使用したメソッドが変換結果で自分自身を呼び出すことがわかったため、エクステンションはオブジェクトに対して呼び出され、その後は結果の辞書で呼び出されました。 – drzaus

+0

Unity3Dでこれをコンパイルできません。アセンブリ参照がありませんか? – c0d3Junk13

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

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 ();'? –

関連する問題