automapper映射动态对象(automapper map dynamic object)

2019-08-06 20:26发布

我与Automapper工作,需要实现以下映射,但不知道如何可以做到。

我想Dictionary对象映射到一个动态的对象,所以,关键是对象的属性和字典的价值的财产动态对象的值。

可这与automapper实现,如果是这样,如何?

Answer 1:

你可以简单地得到DictionaryExpandoObject ,并与原有的字典中的值填充

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


Answer 2:

这里是连接的例子,但如果你删除评论或阐述你的文章也可能是更多的描述。 鉴于这种类:

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

如果您想包括更多或不同的结果,指定不同BindingFlagsGetProperties方法。 如果这不回答你的问题,请发表评论。

另外,假设你有一个动态的对象,匿名类型,该方法是相似的。 下面的例子,显然,不需要类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));


文章来源: automapper map dynamic object