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 とまったく同じですが、これを取得するために非 null/空の値のみを取得したい場合

{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 に答える