如何告诉AutoMapper使用“按引用传递?”

问题描述 投票:4回答:2

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

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通过引用而不是按值运行映射?

c# automapper
2个回答
0
投票

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

话虽如此,假设您只想填充目标中的null属性,您需要正确配置映射,而当destination属性具有值时则不进行映射。

下面的示例针对类属性完全做到了这一点。对于值属性,可能需要进行其他配置。该示例使用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");
    }
}

-1
投票

仅使用传统的浅克隆...

Person completePerson = basePerson.MemberwiseClone();

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

MSDN Link

© www.soinside.com 2019 - 2024. All rights reserved.