[英]Automapper convention based mapping for collection
我有一個項目,正在嘗試將字典映射到ViewModel.NamedProperty。 我正在嘗試使用AutoMapper自定義解析器執行基於約定的映射。 我的約定是,如果源字典鍵存在指定的屬性,則從字典的值映射一個屬性。 這是我的示例類:
class User
{
string Name {get;set;}
Dictionary<string, AccountProp> CustomProperties {get;set;}
}
class AccountProp
{
string PropertyValue {get;set;}
//Some other properties
}
class UserViewModel
{
string Name {get;set;}
DateTime LastLogin {get;set;}
string City {get;set}
}
var user = new User()
{
Name = "Bob"
};
user.CustomProperties.Add("LastLogin", new AccountProp(){PropertyValue = DateTime.Now};
user.CustomProperties.Add("City", new AccountProp(){PropertyValue = "SomeWhere"};
我想按慣例將所有屬性的User CustomProperties字典映射到展平的UserViewModel,並且我不想為映射單獨指定每個屬性。
最好的方法是什么? 我當時在考慮自定義值解析器,但似乎必須指定要單獨映射的每個成員。 如果要這樣做,我將在沒有AutoMapper的情況下手動執行映射。
以下是達到目的的代碼。 不確定它是否好。
Mapper.CreateMap<User, UserViewModel>()
.ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name)) // Optional
.ForMember(dest => dest.City, opt => opt.MapFrom(src => src.CustomProperties.FirstOrDefault(x => x.Key == "City").Value.PropertyValue.ToString())) // Handle null
.ForMember(dest => dest.LastLogin, opt => opt.MapFrom(src => Convert.ToDateTime(src.CustomProperties.FirstOrDefault(x => x.Key == "LastLogin").Value.PropertyValue))); //Handle null
我最終創建了一個自定義類型轉換器來處理這種情況,並且效果很好:
public class ObjectToPropertyTypeConverter<TFromEntity> : ITypeConverter<TFromEntity, HashSet<Property>>
{
//perform custom conversion here
}
然后,我實現了自定義映射,如下所示:
AutoMapper.Mapper.CreateMap<MyViewModel, HashSet<Property>>()
.ConvertUsing<ObjectToPropertyTypeConverter<MyViewModel>>();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.