2011-12-30 15 views
0

オブジェクトへ:辞書<文字列、オブジェクト>最善の方法は、この辞書を変換する何

Dictionary<string, object> person = new Dictionary<string, object>(); 
          person.Add("ID", 1); 
          person.Add("Name", "Alex"); 

オブジェクトへ:

public class Person 
{ 
public int ID{get;set;} 
public string Name{get;set;} 
} 

を?

+0

このリンクをチェックアウト、それはあなたの質問にhttpを答えることがあります。//blog.andreloker .de/post/2008/05/03/Anonymous-type-to-dictionary-using DynamicMethod.aspx – MethodMan

+0

データベースの選択クエリから返すオブジェクトが必要です。 –

+1

辞書クラスには誤解があります。 1つの意味論的オブジェクトに対応する辞書の2つの異なる要素を作っているようです。あなたが必要とするのは、Personオブジェクトへのintマッピングを持つDictionaryオブジェクトのようです。 –

答えて

2

一般的なオブジェクトでこれを行うには、反射を使用できます。辞書内の値を仮定すると、適切なタイプであり、何の変換は必要ありません:それを使用する次に

static T GetObject<T>(Dictionary<string, object> dict) 
    where T : new() 
{ 
    var obj = new T(); 
    foreach (var property in typeof(T).GetProperties()) 
    { 
     var args = new object[1]; 
     var setter = property.GetSetMethod(); // property has a public setter 
     if (setter != null && dict.TryGetValue(property.Name, out args[0])) 
      setter.Invoke(obj, args); 
    } 
    return obj; 
} 

を:

var alexDict = new Dictionary<string, object> 
{ 
    { "ID", 1 }, 
    { "Name", "Alex" }, 
}; 
var alexPerson = GetObject<Person>(alexDict); 
0
Person myPerson = new Person(); 
myPerson.ID = (int)person["ID"]; 
myPerson.Name = (string)person["Name"]; 

intキャストでエラーチェックを行いません。

4

は、ここに私の提案です:

var newPerson = new Person 
    { 
     ID = (int)person["ID"], 
     Name = person["Name"].ToString() 
    }; 

これは何のエラー処理を持っていないとフィールドが辞書に存在し、有効な値で満たされていると仮定しています!

0

簡単な方法:

var person = new Person 
{ 
    Id = (int)dict["ID"], 
    Name = (string)dict["Name"] 
} 

一般的な方法:リフレクションを使用します。

関連する問題