2013-01-15 172 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; 
}