AutoMapper数据填充

时间:2011-07-19 19:20:20

标签: c# mapping automapper valueinjecter

是否可以使用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的适当用法进行了一些很好的讨论。

3 个答案:

答案 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方法创建特定的映射。