[英]AutoMapper - Map two source collections of different types into a single destination collection
[英]AutoMapper - Map using the same source and destination object types
我正在使用Automapper來獲取兩個相同類型的對象,並映射已更改的任何新值。 我嘗試使用下面的代碼,但它不斷拋出錯誤,我甚至不確定這是否可以通過Automapper實現。
例如:
Mapper.CreateMap<UserDetails, UserDetails>();
UserDetails userDetails = Mapper.Map<UserDetails, UserDetails>(userDetailsCurrent, userDetailsNew);
基本上,我需要將從新對象“userDetailsNew”進入的任何新值復制到現有對象“userDetailsCurrent” - 即使它們屬於同一類型。 這樣我就可以用新值“更新”現有對象。 我這樣做的原因是因為我不確定將傳遞哪些用戶詳細信息 - 我需要在它們到達時映射它們。
我通常使用Automapper來映射具有相似屬性的不同對象 - 但我認為我可以使用Automapper的強大功能以這種方式實現相同的功能。 甚至可能有更好的解決方案 - 任何幫助將不勝感激!
這似乎對我有用。 我的自定義類型:
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);
除了簡單屬性之外,您的自定義類型有什么意義?
這可以使用元組和創建從Automapper的Abstract 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);
}
}
然后你可以構建自定義轉換器類型
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;
}
}
可以像
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);
這將產生保持原始姓氏值的結果,因為更新中缺少原始姓氏值,但更新名字值,例如。
Firstname: Cliff, Lastname: Mayson
這是Automapper的已知行為( 請參閱問題 )。 你實際上必須告訴Automapper:
CreateMap<A,A>(); CreateMap<B,B>(); CreateMap<C,C>();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.