2017-11-22 2 views
0

AutoMapperを使用して、同じタイプの2つのオブジェクトをマージし、nullまたはfalseのフィールドを上書きします。例えば、私は次のモデルを持っていると言う:同じタイプのAutomapperマッピングオブジェクト - Boolを上書きする

public class TestModel 
{ 
    public string A { get; set; } 
    public string B { get; set; } 
    public bool C { get; set; } 
    public bool D { get; set; } 
} 

そして、例えば2つのモデルを設定:

var model1 = new TestModel 
{ 
    A = "a", 
    B = "b", 
    C = true, 
    D = false 
} 

var model1 = new TestModel 
{ 
    A = null, 
    B = "b", 
    C = false, 
    D = true 
} 

を私がマージされたモデルが

var mergedModel = new TestModel 
{ 
    A = "a", 
    B = "b", 
    C = true, 
    D = true 
} 

ようになりますので、それらをマージしたいですこれまでのところ、私は以下のマッパー構成を持っています:

Mapper.Initialize(cfg => 
{ 
    cfg.CreateMap<TestModel, TestModel>() 
     .ForAllMembers(options => 
     { 
      options.Condition((source, destination, member) => member != null); 
     }); 
}); 

var mergedModel = Mapper.Map(model1, model2); 

しかしもちろん、私はmergedModel.D = falseで終わります。他のどのような条件が必要なので、偽のブールは上書きされますか?

+1

質問に答えるものではないが、しかし、コードの読みやすさの観点から、:

しかし、あなたが本当にAutoMapperの魔法を経由してそれを実行したい場合は、この条件を追加することができます(TestModel、TestModel)静的なカスタムマッピングメソッドは、より直感的かもしれませんが、いくつかの付加価値を適用すると同時に、ビジネスオブジェクトはgrokに簡単になりませんか? (つまり、Automapperでビジネスロジックを隠しておくと、保守が面倒になる可能性があります) – StuartLC

+0

これはAutoMapperの本当に奇妙な使用例です。クラス自体の論理をマージメソッドなどでカプセル化します –

答えて

1

マッピングにいくつかのロジックを実装している場合は、各メンバーで明示的に行う方がよいでしょう。同じに2つのオブジェクトをマッピングするためにAutoMapperを使用して

options.Condition((source, destination, member) => (member as bool?) != false); 
関連する問題