自动地图动态对象

本文关键字:对象 动态 地图 | 更新日期: 2023-09-27 17:53:21

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

我想把一个Dictionary对象映射到一个动态对象,这样键就是对象上的属性,Dictionary的值就是动态对象中属性的值。

这可以实现与自动器,如果可以,如何?

自动地图动态对象

您可以简单地从ExpandoObject中获得Dictionary,并用原始字典值填充它

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

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