首页 > 解决方案 > 自动映射动态对象,忽略属性名称的大小写

问题描述

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

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

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

标签: automapper

解决方案


如果您的动态对象实现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;
            });
        });

推荐阅读