AutoMapper類別輕鬆轉換

  • 831
  • 0
  • 2021-08-08

AutoMapper簡單介紹,類別輕鬆轉換

開發環境

  • Windows 10 Home x64
  • Visual Studio 2019 community
  • dotNet4.7.2
  • AutoMapper 10.1.1

 

官方網站:https://automapper.org/

 

下載AutoMapper

基礎用法

新增測試類別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