4

默认情况下,自动映射器会根据目标类型创建一个新对象:

public void Doit( Person personMissingStuff )
{
    PersonTemplate template = _personDao.GetPersonTemplate(1);
    Mapper.CreateMap<PersonTemplate, Person>();
    Person basePerson = Mapper.Map<Person>( template );
    Mapper.CreateMap<Person, Person>();
    Person completePerson = 
       Mapper.Map<Person, Person>( basePerson, personMissingStuff );
    ...
}

completePerson我没有得到一个,而是basePerson再次得到一个。如何告诉 AutoMapper 按引用而不是按值运行映射?

4

2 回答 2

0

Mapper.Map(source, dest)实际上返回目标对象,在您的情况下它将是personMissingStuff.

话虽如此,假设您只想填写目标中的空属性,则需要正确配置映射,而不是在目标属性有值时进行映射。

以下示例对类属性正是这样做的。对于值属性,您可能需要进行额外的配置。该示例使用 NUnit 和 SharpTestsEx:

[TestFixture]
public class LoadIntoInstance
{
    public class Template
    {
        public string Name { get; set; }
    }

    public class Person
    {
        public string Name { get; set; }
        public string OtherData { get; set; }
    }        

    [Test]
    public void Should_load_into_instance()
    {
        Mapper.CreateMap<Template, Person>()
            .ForMember(d=>d.OtherData, opt=>opt.Ignore());
        Mapper.CreateMap<Person, Person>()
            .ForAllMembers(opt=>opt.Condition(ctx=>ctx.DestinationValue==null));
        Mapper.AssertConfigurationIsValid();

        var template = new Template {Name = "template"};
        var basePerson = Mapper.Map<Person>(template);

        var noNamePerson = new Person {OtherData = "other"};

        var result = Mapper.Map(basePerson, noNamePerson);

        result.Should().Be.SameInstanceAs(noNamePerson);
        result.Satisfy(r =>
                       r.Name == "template" &&
                       r.OtherData == "other");
    }
}
于 2013-05-29T21:49:00.127 回答
-1

只需使用传统的浅克隆...

Person completePerson = basePerson.MemberwiseClone();

这应该保留引用类型并克隆值类型。

MSDN 链接

于 2013-05-29T20:19:13.740 回答