2012-04-02 17 views
5

Automapperを使用して、同じタイプの2つのオブジェクトを取得し、変更された新しい値をマップします。私は以下のコードを使ってみましたが、エラーを投げつけています。Automapperでもこれが達成できるかどうかはわかりません。例えばAutoMapper - 同じソースオブジェクトと宛先オブジェクトタイプを使用したマップ

 Mapper.CreateMap<UserDetails, UserDetails>(); 
     UserDetails userDetails = Mapper.Map<UserDetails, UserDetails>(userDetailsCurrent, userDetailsNew); 

は基本的に、私は、既存のオブジェクト「userDetailsCurrent」への新しいオブジェクト「userDetailsNew」から来た新しい値を越えコピーする必要がある - それらは同じ種類のものであるにもかかわらず、 。このようにして、既存のオブジェクトを新しい値で「更新」することができます。私がこれをやっているのは、ユーザーの詳細がどのように渡されるかわからないからです。到着時に地図を作成する必要があります。

私は通常Automapperを使って同様のプロパティを持つさまざまなオブジェクトをマッピングしていますが、私はAutomapperの能力を使って同じことを達成できると考えました。よりよい解決策があるかもしれません - どんな助けも高く評価されるでしょう!

+0

'Mapper.Map'は' UserDetails'または 'UserSession'を返すべきですか? –

+0

UserDetailsが返されるはずです - コードサンプルを更新しました。 – Deano

+0

どのようなエラーがスローされますか? –

答えて

6

これは私にとってはうまくいくようです。私のカスタムタイプ:

class MyType 
{ 
    public int MyInt { get; set; } 
    public string MyString { get; set; } 
} 

マイマッピングコード:単純なプロパティを超えたカスタムタイプについての興味深いです何

Mapper.CreateMap<MyType, MyType>(); 
var source = new MyType() {MyInt = 1, MyString = "Hello world"}; 
var dest = Mapper.Map<MyType, MyType>(source); 

+0

これはよく見えます - 私のPCの近くにいないので、病気をチェックしてすぐに戻ってください! – Deano

+0

ForMember()を使用せずにできることはありますか?オブジェクトの各プロパティに対してそれを行わないほうがきれいかもしれません。 – Deano

+0

ForMemberをやっていないのであれば、うまくいきます。私は最初にそれを含めたものを使用するのに慣れています。 –

4

これは、タプルを使用して、Automapperの抽象TypeConverterクラスから派生したカスタムタイプコンバータを作成することによって行うことができます。

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public override string ToString() 
    { 
     return string.Format("Firstname: {0}, Lastname: {1}", FirstName, LastName); 
    } 
} 

次にあなたが

var orginal = new Person() {FirstName = "Clifford", LastName = "Mayson"}; 
     var updated = new Person() {FirstName = "Cliff"}; 

     Mapper.CreateMap<Tuple<Person, Person>, Person>().ConvertUsing<CustomerPersonConverter>(); 

     var result = Mapper.Map<Person>(new Tuple<Person, Person>(orginal, updated)); 

     Console.WriteLine(result); 

のように使用することができ

public class CustomerPersonConverter : TypeConverter<Tuple<Person, Person>, Person> 
{ 
    protected override Person ConvertCore(Tuple<Person, Person> source) 
    { 
     var orginalValues = source.Item1; 
     var updatedValues = source.Item2; 

     var result = new Person 
      { 
       FirstName = string.IsNullOrEmpty(updatedValues.FirstName) ? orginalValues.FirstName : updatedValues.FirstName, 
       LastName = string.IsNullOrEmpty(updatedValues.LastName) ? orginalValues.LastName : updatedValues.LastName 
      }; 

     return result; 
    } 
} 

としてカスタムコンバータタイプを構築することができます:

は、あなたがの送信元と送信先クラスを持っていたと言う

更新で欠落していた元の姓の値を保持した結果が生成されますが、updaファーストネームの値(例:

Firstname: Cliff, Lastname: Mayson 
+0

わかりやすい例をありがとう。 – PratikSatikunvar

関連する問題