私は Automapper を使用しており、次のマッピングを実現する必要がありますが、その方法がわかりません。
Dictionary オブジェクトを動的オブジェクトにマップして、キーがオブジェクトのプロパティになり、辞書の値が動的オブジェクトのプロパティの値になるようにします。
これはオートマッパーで実現できますか?もしそうなら、どのように?
私は Automapper を使用しており、次のマッピングを実現する必要がありますが、その方法がわかりません。
Dictionary オブジェクトを動的オブジェクトにマップして、キーがオブジェクトのプロパティになり、辞書の値が動的オブジェクトのプロパティの値になるようにします。
これはオートマッパーで実現できますか?もしそうなら、どのように?
元の辞書の値Dictionary
から取得して入力するだけですExpandoObject
void Main()
{
AutoMapper.Mapper.CreateMap<Dictionary<string, object>, dynamic>()
.ConstructUsing(CreateDynamicFromDictionary);
var dictionary = new Dictionary<string, object>();
dictionary.Add("Name", "Ilya");
dynamic dyn = Mapper.Map<dynamic>(dictionary);
Console.WriteLine (dyn.Name);//prints Ilya
}
public dynamic CreateDynamicFromDictionary(IDictionary<string, object> dictionary)
{
dynamic dyn = new ExpandoObject();
var expandoDic = (IDictionary<string, object>)dyn;
dictionary.ToList()
.ForEach(keyValue => expandoDic.Add(keyValue.Key, keyValue.Value));
return dyn;
}
これが例ですが、コメントを削除したり、投稿を詳しく説明したりすると、よりわかりやすくなる可能性があります。このクラスを考えると:
class Foo
{
public Foo(int bar, string baz)
{
Bar = bar;
Baz = baz;
}
public int Bar { get; set; }
public string Baz { get; set; }
}
この方法で、パブリックインスタンスのプロパティと値のディクショナリを作成できます。
var valuesByProperty = foo.GetType().
GetProperties(BindingFlags.Public | BindingFlags.Instance).
ToDictionary(p => p, p => p.GetValue(foo));
より多くのまたは異なる結果を含める場合BindingFlags
は、GetProperties
メソッドで異なるを指定します。これで質問に答えられない場合は、コメントを残してください。
または、動的オブジェクトと匿名型を使用していると仮定すると、アプローチは似ています。次の例は、明らかに、クラスを必要としませんFoo
。
dynamic foo = new {Bar = 42, Baz = "baz"};
Type fooType = foo.GetType();
var valuesByProperty = fooType.
GetProperties(BindingFlags.Public | BindingFlags.Instance).
ToDictionary(p => p, p => p.GetValue(foo));