automapper map动态对象

时间:2013-01-15 00:39:52

标签: c# dynamic dictionary automapper

我正在使用Automapper,需要实现以下映射,但不确定如何完成。

我想将Dictionary对象映射到动态对象,因此键是对象的属性,而字典的值是动态对象中属性的值。

这可以通过automapper实现,如果是,怎么做?

2 个答案:

答案 0 :(得分:8)

您只需从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;
}

答案 1 :(得分: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));

如果要包含更多或不同的结果,请在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));