AutoMapper簡單介紹,類別輕鬆轉換
開發環境
- Windows 10 Home x64
- Visual Studio 2019 community
- dotNet4.7.2
- AutoMapper 10.1.1

基礎用法
新增測試類別ProductInfo、ProductSimpleInfo
public class ProductInfo
{
public int Id { get; set; }
public string ProductName { get; set; }
public string Specification { get; set; }
public decimal Price { get; set; }
public DateTime ReleaseDate { get; set; }
public int WarrantyDay { get; set; }
public string Instruction { get; set; }
}
public class ProductSimpleInfo
{
public int Id { get; set; }
public string ProductName { get; set; }
public int Price { get; set; }
}
新增Mapping Profile
需引用AutoMappe
數值型別可以自動轉換,Price在SimpleInfo的型別為int,還是可以自動轉型
範例中將ProductSimpleInfo轉回ProductInfo,Price不需要任何處理也能正常轉換,實務使用須注意整數型別及小數型別轉換問題,避免輸出異常
using AutoMapper;
public class ProdcutMapping : Profile
{
public ProdcutMapping()
{
CreateMap<ProductInfo, ProductSimpleInfo>();
CreateMap<ProductSimpleInfo, ProductInfo>();
}
}
使用範例
//建立MapperConfig
var _config = new MapperConfiguration(cfg => cfg.AddProfile<ProdcutMapping>());
//建立Mapper
var _mapper = _config.CreateMapper();
var product = new ProductInfo().GetProduct();
ProductSimpleInfo productSimpleInfo = _mapper.Map<ProductSimpleInfo>(product);
ProductInfo product1 = _mapper.Map<ProductInfo>(productSimpleInfo);
var products = new ProductInfo().GetProducts();
List<ProductSimpleInfo> productSimpleInfos = _mapper.Map<List<ProductSimpleInfo>>(products);
List<ProductInfo> productInfos = _mapper.Map<List<ProductInfo>>(productSimpleInfos);
成果


進階用法
新增測試類別Member、MemberVM
public class Member
{
public string Name { get; set; }
public string Phone { get; set; }
public string Address { get; set; }
public Member()
{
this.Name = "Kevin,Lin";
this.Phone = "0912-456-789";
this.Address = "台北市,大安區,羅斯福路,四段,1號";
//10617台北市大安區羅斯福路四段1號
}
}
public class MemberVM
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Phone { get; set; }
public string Country { get; set; }
public string Township { get; set; }
public string Road { get; set; }
public string Section { get; set; }
public string No { get; set; }
}
新增Mapping Profile
當欄位不相等時,可以互相組合或拆解,下面範例為簡單示範,實作中可能會發生例外
using AutoMapper;
public class MemberMapping : Profile
{
public MemberMapping()
{
CreateMap<Member, MemberVM>()
.ForMember(x => x.FirstName, y => y.MapFrom(o => o.Name.Split(',')[0]))
.ForMember(x => x.LastName, y => y.MapFrom(o => o.Name.Split(',')[1]))
.ForMember(x => x.Country, y => y.MapFrom(o => o.Address.Split(',')[0]))
.ForMember(x => x.Township, y => y.MapFrom(o => o.Address.Split(',')[1]))
.ForMember(x => x.Road, y => y.MapFrom(o => o.Address.Split(',')[2]))
.ForMember(x => x.Section, y => y.MapFrom(o => o.Address.Split(',')[3]))
.ForMember(x => x.No, y => y.MapFrom(o => o.Address.Split(',')[4]));
CreateMap<MemberVM, Member>()
.ForMember(x => x.Name, y => y.MapFrom(o => $"{o.FirstName},{o.LastName}"))
.ForMember(x => x.Address
, y => y.MapFrom(o => $"{o.Country},{o.Township},{o.Road},{o.Section},{o.No}"));
}
}
使用範例
//建立MapperConfig
var _config = new MapperConfiguration(cfg => cfg.AddProfile<MemberMapping>());
//建立Mapper
var _mapper = _config.CreateMapper();
var member = new Member();
var memberVM = _mapper.Map<MemberVM>(member); // 將Member轉型成MemberVM
var member2 = _mapper.Map<Member>(memberVM); // 將MemberVM轉型成Member
原始碼:https://github.com/Wonsle/Demo.AutoMapper
參考連結:AutoMapperGitHub