2011-01-30 10 views
0

ディクショナリ(または他の名前/値コレクション)からプロパティをマップできるオブジェクトオブジェクトマッパはありますか?Dictionary <string、object>からオブジェクトマッパーへ

のは、コンテキストおよびメタデータ関連の多くを必要とASP.NET MVCでDefaultModelBinder、同様に基本的だ

var values = new Dictionary<string,object>(); 
values.Add("Text","Foo"); 
values.Add("HomeAddress.Street","Some street 123"); 
values.Add("HomeAddress.PostalCode","12345"); 
values.Add("HomeAddress.City","Some city"); 
values.Add("Numbers[0]",123); 
values.Add("Numbers[1]",234); 
values.Add("Numbers[2]",345); 

SomeClass some = aMapperTool.CreateFromDictionary<SomeClass>(values); 

である私がやりたい私はクラス

public class SomeClass 
{ 
    public string Text { get; set; } 
    public Address HomeAddress { get; set; } 
    public List<int> Numbers { get; set; } 
} 
public class Address 
{ 
    public string Street { get; set; } 
    public string PostalCode { get; set; } 
    public string City { get; set; }  
} 

を持っているとしましょう非常に便利ではありません。

+0

チェック[この](http://samarskyy.blogspot.com/2011/02/net- stackoverflowの内の他の場所で対処されている(ComponentModelの機能を利用することができます – AlexBar

答えて

0

あなたはこれについてリフレクションツリーまたはエクスプレッションツリーを回避しません。反射して

、それはおおよそ次のようになります。

  1. detailsのキーの上にT
  2. 反復のオブジェクトを作成し、必要に応じて、HomeAddress.Street(そこから実際のプロパティ名を構築します - >HomeAdress、またはNumbers[0] - >Number)。プロパティのタイプに応じて(.が見つかった場合は、[が見つかった場合は子オブジェクトを最初に構築する必要があります。IEnumerableを初期化する必要があります)。
  3. 子構造を構築した後、親オブジェクトを構築します。

これは可能な解決策ですが、私の頭には「なぜ?」という質問があります。

+0

醜いxmlのない単一のデータベーステーブルまたはテキストファイルに任意のpocoオブジェクトを保存して、 "where = 'foo'およびvalue = 'bar' " –

+0

私は、POCOを保存/ロードするためのカスタムラッパーを持つsqliteを使用することをお勧めします。タスクは恐ろしいものであり、特に "データベース"に頻繁にアクセスする場合は、アプリケーションのパフォーマンスに負の影響を与えます。 – Femaref

1

あなたは、これは

how to set nullable type via reflection code (c#)?

using System.ComponentModel; 

public void FillMeUp(Dictionary<string, string> inputValues){ 

     PropertyInfo[] classProperties = this.GetType().GetProperties(); 

     var properties = TypeDescriptor.GetProperties(this); 

     foreach (PropertyDescriptor property in properties) 
     { 
      if (inputValues.ContainsKey(property.Name)) 
      { 
       var value = inputValues[property.Name]; 
       property.SetValue(this, 
           property.Converter.ConvertFromInvariantString(value)); 
      } 
     } 
関連する問題