4

デフォルトでは、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 に指示するにはどうすればよいですか?

4

2 に答える 2

0

Mapper.Map(source, dest)実際には宛先オブジェクトを返します。あなたの場合は になりますpersonMissingStuff

そうは言っても、宛先の null プロパティのみを入力する場合は、マッピングを適切に構成する必要があり、宛先プロパティに値がある場合はマップしないでください。

次のサンプルは、クラス プロパティに対してまさにこれを行います。値のプロパティについては、おそらく追加の構成を行う必要があります。この例では、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 に答える