2013-01-15 170 views
4

我正在使用Automapper,需要實現以下映射,但不知道如何完成。自動映射器映射動態對象

我想將Dictionary對象映射到動態對象,以便鍵是對象上的屬性,而字典的值是動態對象中屬性的值。

這可以用automapper來實現嗎?如果是這樣,怎麼辦?

+0

有爲什麼你需要的對象是動態的,一個特別的原因,在這種情況呢?正如我所看到的,字典將是'Dictionary '的類型。 – Mir

回答

0

下面是一個例子,但是如果您刪除評論或詳細說明您的帖子,則可能會更具描述性。鑑於這種類:

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)); 

如果您想包括更多或不同的結果,在GetProperties方法指定不同的BindingFlags 。如果這沒有回答你的問題,請留下評論。

或者,假設您正在使用動態對象和匿名類型,則此方法類似。以下示例顯然不需要類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)); 
7

你可以簡單地得到ExpandoObjectDictionary,並與原有的字典填充值

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; 
}