4

如果指定类的源对象为空,是否可以将 AutoMapper 配置为将所有属性设置为默认值?我知道我应该用它Mapper.AllowNullDestinationValues = false;来为应用程序中的所有类做我想做的事情。这是我用于测试的示例代码,但它不起作用

public class A
{
    static A()
    {
        Mapper.Initialize(
            config =>
                {
                    config.ForSourceType<B>().AllowNullDestinationValues = false;
                    config.CreateMap<B, A>()
                        .ForMember(member => member.Name, opt => opt.Ignore());
                });
        //Mapper.AllowNullDestinationValues = false;

        Mapper.AssertConfigurationIsValid();
    }

    public void Init(B b)
    {
        Mapper.DynamicMap(b, this);
    }

    public int? Foo { get; set; }
    public double? Foo1 { get; set; }
    public bool Foo2 { get; set; }
    public string Name { get; set; }
}

public class B
{
    public string Name { get; set; }
    public int? Foo { get; set; }
    public double? Foo1 { get; set; }
    public bool Foo2 { get; set; }
}

使用此代码:

var b = new B() {Foo = 1, Foo1 = 3.3, Foo2 = true, Name = "123"};
var a = new A {Name = "aName"};
a.Init(b);      // All ok: Name=aName, Foo=1, Foo1=3,3, Foo2=True
a.Init(null);   // Should be Name=aName, Foo=null, Foo1=null, Foo2=False, 
                // but a has the same values as on a previous line
4

2 回答 2

1

它必须与已经映射的“a”相关。

var a = new A {Name = "aName"};
a.Init(b);
a.Init(null);

所有映射都被缓存,因此如果您尝试重新映射相同的实例,自动映射器只会保留原始结果。

为了测试它,请尝试:

        var c = new A {Name = "x"};
        c.Init(null); 

这是类似问题的链接。

于 2012-09-21T02:52:06.910 回答
0

如果您设置,它看起来将替换为 null Mapper.Configuration.AllowNullDestinationValues = false

public class A
    {
        static A()
        {
            Mapper.Initialize(
                config =>
                {
                    config.ForSourceType<B>().AllowNullDestinationValues = false;
                    config.CreateMap<B, A>()
                        .ForMember(member => member.Name, opt => opt.Ignore());
                });
            Mapper.Configuration.AllowNullDestinationValues = false;

            Mapper.AssertConfigurationIsValid();
        }

        public void Init(B b)
        {
            Mapper.DynamicMap(b, this);
        }

        public int? Foo { get; set; }
        public double? Foo1 { get; set; }
        public bool Foo2 { get; set; }
        public string Name { get; set; }
    }
于 2012-09-20T13:05:15.777 回答