默认情况下,automapper 根据目的地的类型创建一个新对象:
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 通过引用而不是通过值来运行映射?
最佳答案
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");
}
}
关于c# - 如何告诉 AutoMapper 使用 "pass by reference?",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16822679/