C# 是否支持Automapper映射到同一对象上的self和更平坦/执行映射
我有一棵物体树。我想用一些默认值更新对象,并展平一些属性。 但是,我不想创建新对象,只需更新现有树即可。 所以我想。我可以用大量的逻辑和递归来实现。或者我可以用自动映射器试试。基本上映射到self。automapper可能会使用源更新目标。并进行奉承: 源/目标类型C# 是否支持Automapper映射到同一对象上的self和更平坦/执行映射,c#,automapper,C#,Automapper,我有一棵物体树。我想用一些默认值更新对象,并展平一些属性。 但是,我不想创建新对象,只需更新现有树即可。 所以我想。我可以用大量的逻辑和递归来实现。或者我可以用自动映射器试试。基本上映射到self。automapper可能会使用源更新目标。并进行奉承: 源/目标类型 公共类Foo { 公共bool SomeBool{get;set;} 公共IEnumerable条{get;set;} } 公共类酒吧 { public bool somebool带有{get;set;} } 映射配置 var c
公共类Foo
{
公共bool SomeBool{get;set;}
公共IEnumerable条{get;set;}
}
公共类酒吧
{
public bool somebool带有{get;set;}
}
映射配置
var config=new-MapperConfiguration(cfg=>
{
CreateMap();
cfg.CreateMap()
.ForMember(dest=>dest.someboolWithdefalling,opt=>opt.MapFrom(src=>true));
});
var mapper=config.CreateMapper();
var foo=新foo
{
Bars=新列表{new Bar()}
};
mapper.Map(foo,foo);
版本:
9.0.0
预期行为
我希望用默认值更新条形图。foo和bars与以前是同一个对象
实际行为
但我得到的只是空酒吧
如果我:
var newFoo=mapper.Map(foo);
然后我得到一个新的foo,更新了条
我知道应该使用自动映射器来创建新对象。但事实并非如此。用例有效吗?仅在目的地进行奉承
复制步骤
班级计划
{
静态void Main(字符串[]参数)
{
var config=new-MapperConfiguration(cfg=>
{
CreateMap();
cfg.CreateMap()
.ForMember(dest=>dest.someboolWithdefalling,opt=>opt.MapFrom(src=>true));
});
var mapper=config.CreateMapper();
var foo=新foo
{
Bars=新列表{new Bar()}
};
var newFoo=mapper.Map(foo);//好的条形图,但有新的对象
Map(foo,foo);//相同的foo,但没有条
Console.WriteLine(foo.bar.First().SomeBoolWithDefalting);
}
}
简短回答:映射到现有集合时,AutoMapper首先清除目标集合
解释 让我们将
名称
属性添加到栏
类:
公共类栏
{
公共字符串名称{get;set;}
public bool somebool带有{get;set;}
}
然后运行下面的映射代码段:
var newFoo=newFoo
{
条=新列表
{
新酒吧
{
Name=“将被映射的条。”,
},
},
};
var notEmptyFoo=newfoo()
{
条=新列表
{
新酒吧
{
Name=“将被删除的条。”,
}
},
};
Console.WriteLine(notEmptyFoo.bar.First().Name);
Map(newFoo,notEmptyFoo);
Console.WriteLine(notEmptyFoo.bar.First().Name);
上面的代码从一个已存在的Foo
条映射到另一个也已存在的Foo
条。但是,在映射过程开始之前,AutoMapper将从目标Foo
(在代码段notEmptyFoo
中命名)中删除所有Bar
控制台输出将显示:
Bar that will be removed.
Bar that will be mapped.
因此,当您从同一个Foo
映射到同一个Foo
时,不仅要在映射之前清除目标Foo
条,还要清除源Foo
以及它是同一个Foo
对象!因此,在清除之后,源Foo
中没有要映射的条,因为它刚刚被清除
如果希望保留目标集合的元素,请查看project。在那里,您可以设置一个EqualityComparison,告诉AutoMapper在集合之间映射时如何识别相同的元素。很有趣。谢谢我现在明白了。。。我会看看收藏。再次感谢:-)您应该将其标记为问题的答案,至少是有用的,或者两者兼而有之。