是否可以使用AutoMapper来填充包含其他对象详细信息的对象?例如(假设先前的配置):
var foo = new Foo { PropA = "", PropB = "Foo" };
var bar = new Bar { PropA = "Bar", PropB = "" };
Mapper.Map<Foo, Bar>(foo, bar);
Console.WriteLine(bar.PropB); //Returns "Foo"
只是想知道是否有人尝试过这种奇怪的映射用法,这更像是将一个对象的匹配数据合并到另一个对象中。
提前致谢!
更新
对于这种情况,看起来ValueInjector也更合适。在StackOverflow上已经对AutoMapper与ValueInjecter的适当用法进行了一些很好的讨论。
答案 0 :(得分:5)
如果属性名称匹配,则它们将自动映射。如果由于某种原因他们没有,你可以自己指定映射。
如下所示,PropA与PropertyA不匹配,因此您必须指定映射。但是,PropB匹配,所以你没有。
var foo = new Foo { PropA = "", PropB = "Foo" };
var bar = new Bar { PropertyA = "Bar", PropertyB = "" };
Mapper.CreateMap<Foo, Bar>()
.ForMember(dest => dest.PropertyA, opt => opt.MapFrom(src => src.PropA));
Mapper.Map<Foo, Bar>(foo, bar);
答案 1 :(得分:2)
好吧,你可以使用ValueInjecter
bar.InjectFrom(foo);
你的酒吧将是:
{PropA = "", ProbB = "Foo"},
完全和Foo一样
但是如果你只想采用非null / empty值来获得这个
{PropA = "Foo", PropbB = "Bar"}
你可以创建一个新的注射
public class NonNullEmptyInj : ConventionInjection
{
protected override bool Match(ConventionInfo c)
{
if (c.SourceProp.Name != c.TargetProp.Name
|| c.SourceProp.Type != c.TargetProp.Type) return false;
if(c.SourceProp.Value == null) return false;
if (c.SourceProp.Type == typeof(string) && c.SourceProp.Value.ToString() == string.Empty) return false;
return true;
}
}
并像这样使用它:
bar.InjectFrom<NonNullEmptyInj>(foo);
答案 2 :(得分:0)
正如其他人所说,你应该在发布之前做更多的功课。但是看看Mapper.AssertConfigurationIsValid方法吧。
[Test]
public void Mappings_Should_Map()
{
//configure mapping here
//Assert
Mapper.AssertConfigurationIsValid();
}
这将告诉您映射是否有效,如果没有,它会告诉您哪些属性不适用。一旦知道失败的映射是什么,就可以使用.ForMember方法创建特定的映射。