3

是否可以使用 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 的适当用途的精彩讨论。

4

3 回答 3

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);
于 2011-07-19T19:33:35.363 回答
2

好吧,你可以使用 ValueInjecter

bar.InjectFrom(foo);

你的酒吧将是:

{PropA = "", ProbB = "Foo"}, 

正是 Foo 的方式,但如果您只想采用非空/空值来获取它

{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);
于 2011-07-21T07:03:25.200 回答
0

正如其他人所说,你真的应该在发布之前做更多的功课。但是请在您使用时查看 Mapper.AssertConfigurationIsValid 方法。

    [Test]
    public void Mappings_Should_Map()
    {
        //configure mapping here

        //Assert
        Mapper.AssertConfigurationIsValid();
    }

这将告诉您映射是否有效,如果不是,它将告诉您哪些属性不适用。一旦您知道失败的映射是什么,您就可以使用 .ForMember 方法创建特定的映射。

于 2011-07-19T19:39:44.297 回答