自动映射动态对象,忽略属性名称的大小写

时间:2018-11-01 13:50:38

标签: automapper

我如何配置映射器,以使其正常工作?

(即动态对象的属性应映射到具有相同字母的类定义的属性-忽略大小写)

public class Foo {
    public int Bar { get; set; }
    public int Baz { get; set; }
}

dynamic fooDyn = new MyDynamicObject();
fooDyn.baR = 5;
fooDyn.bAz = 6;

Mapper.Initialize(cfg => {});

Foo result = Mapper.Map<Foo>(fooDyn);
result.Bar.ShouldEqual(5);
result.Baz.ShouldEqual(6);

2 个答案:

答案 0 :(得分:1)

如果您的动态对象实现了IDictionary<string,object>(例如ExpandoObject),则以下内容应该可以工作。必须有一些更简便的方法,因为即使大小写不同,匿名对象也可以很好地映射。

        Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<IDictionary<string, object>, Foo>()
            .ConstructUsing(d =>
            {
                Foo foo = new Foo();

                foreach (System.Reflection.PropertyInfo prop in typeof(Foo).GetProperties())
                {
                    foreach (KeyValuePair<string, object> entry in d)
                    {
                        if (entry.Key.ToLowerInvariant() == prop.Name.ToLowerInvariant())
                        {
                            prop.SetValue(foo, entry.Value);
                            break;
                        }
                    }
                }

                return foo;
            });
        });

答案 1 :(得分:0)

AutoMapper允许您以这种样式在地图配置上配置显式成员映射:

var config = new MapperConfiguration(cfg =>
            {

                var dynamicMap = cfg.CreateMap<IDictionary<string, object>, SomethingDTO>();
                dynamicMap.ForAllMembers((expression) => expression.MapFrom(source =>
                    source.ContainsKey(expression.DestinationMember.Name.Substring(0, 1).ToLower()
                                                                            + expression.DestinationMember.Name.Substring(1))
                    ? source[expression.DestinationMember.Name.Substring(0, 1).ToLower()
                                    + expression.DestinationMember.Name.Substring(1)]  : null
                ));
            });

要将动态/扩展对象(驼峰式案例)映射到带有pascal案例成员的类型,可以在显式地图配置上使用ForAllMembers。可能的用例:DTO的json负载。

与其他答案(也有效)相比,该方法使您可以继续受益并使用所有其他地图功能和配置。