隐藏

AutoMapper简明教程

发布:2021/7/2 14:33:54作者:管理员 来源:本站 浏览次数:1369

   最近做项目,需要把DataTable中的数据强类型化.于是试用了下比较常用的AutoMapper,通过看代码中附带的Demo与网上的教程,也算能够勉强使用了,现将学习笔记记录如下:



复制代码

复制代码


namespace ConsoleApplication1

{

   class Program

   {

       static void Main(string[] args)

       {

           //1.普通转换

           Name name1 = new Name() { FirstName = "L", LastName = "jz" };

           Mapper.CreateMap<Name, NameDto>()

               .BeforeMap((name, nameDto) => Console.WriteLine("hello world before"))

               .AfterMap((name, nameDto) => Console.WriteLine("hello world after"));

           NameDto nameDto1 = Mapper.Map<Name, NameDto>(name1);

           Console.WriteLine("1");

           Console.WriteLine(nameDto1.FirstName + nameDto1.LastName);

           Console.WriteLine();

           //Console.ReadKey();


           //整体设置

           //2.整体即时转换

           Mapper.Reset();

           Name name2 = new Name() { FirstName = "L", LastName = "jz" };

           Mapper.CreateMap<Name, NameDto>()

               .ConstructUsing(name => new NameDto() { AllName = name.FirstName + name.LastName });

           NameDto nameDto2 = Mapper.Map<Name, NameDto>(name2);

           Console.WriteLine("2");

           Console.WriteLine(nameDto2.AllName);

           Console.WriteLine();

           //Console.ReadKey();


           //3.整体通过TypeConverter类型转换

           Mapper.Reset();

           Name name3 = new Name() { FirstName = "L", LastName = "jz" };

           Mapper.CreateMap<Name, NameDto>()

               .ConvertUsing<NameConverter>();

           NameDto nameDto3 = Mapper.Map<Name, NameDto>(name3);

           Console.WriteLine("3");

           Console.WriteLine(nameDto3.AllName);

           Console.WriteLine();

           //Console.ReadKey();


           //单属性设置

           //4.属性条件转换

           Mapper.Reset();

           Name name4 = new Name() { FirstName = "L", LastName = "jz" };

           Mapper.CreateMap<Name, NameDto>()

               .ForMember(name => name.FirstName, opt => opt.Condition(name => !name.FirstName.Equals("l", StringComparison.OrdinalIgnoreCase)));

           NameDto nameDto4 = Mapper.Map<Name, NameDto>(name4);

           Console.WriteLine("4");

           Console.WriteLine(string.IsNullOrEmpty(nameDto4.FirstName));

           Console.WriteLine();

           //Console.ReadKey();


           //5.属性忽略

           Mapper.Reset();

           Name name5 = new Name() { FirstName = "L", LastName = "jz" };

           Mapper.CreateMap<Name, NameDto>()

               .ForMember(name => name.FirstName, opt => opt.Ignore());

           NameDto nameDto5 = Mapper.Map<Name, NameDto>(name5);

           Console.WriteLine("5");

           Console.WriteLine(string.IsNullOrEmpty(nameDto5.FirstName));

           Console.WriteLine();

           //Console.ReadKey();


           //6.属性转换

           Mapper.Reset();

           Name name6 = new Name() { FirstName = "L", LastName = "jz" };

           Mapper.CreateMap<Name, NameDto>()

               .ForMember(name => name.AllName, opt => opt.MapFrom(name => name.FirstName + name.LastName));

           NameDto nameDto6 = Mapper.Map<Name, NameDto>(name6);

           Console.WriteLine("6");

           Console.WriteLine(nameDto6.AllName);

           Console.WriteLine();

           //Console.ReadKey();


           //7.属性通过ValueResolver转换

           Mapper.Reset();

           Name name7 = new Name() { FirstName = "L", LastName = "jz" };

           Mapper.CreateMap<Name, StoreDto>()

               .ForMember(storeDto => storeDto.Name, opt => opt.ResolveUsing<NameResolver>());

           StoreDto store1 = Mapper.Map<Name, StoreDto>(name7);

           Console.WriteLine("7");

           Console.WriteLine(store1.Name.FirstName + store1.Name.LastName);

           Console.WriteLine();

           //Console.ReadKey();


           //8.属性填充固定值

           Mapper.Reset();

           Name name8 = new Name() { FirstName = "L", LastName = "jz" };

           Mapper.CreateMap<Name, NameDto>()

               .ForMember(name => name.AllName, opt => opt.UseValue<string>("ljzforever"));

           NameDto nameDto8 = Mapper.Map<Name, NameDto>(name8);

           Console.WriteLine("8");

           Console.WriteLine(nameDto8.AllName);

           Console.WriteLine();

           //Console.ReadKey();


           //9.属性格式化

           Mapper.Reset();

           Name name9 = new Name() { FirstName = "L", LastName = "jz" };

           Mapper.CreateMap<Name, NameDto>()

               .ForMember(name => name.FirstName, opt => opt.AddFormatter<StringFormatter>());

           NameDto nameDto9 = Mapper.Map<Name, NameDto>(name9);

           Console.WriteLine("9");

           Console.WriteLine(nameDto9.FirstName);

           Console.WriteLine();

           //Console.ReadKey();


           //10.属性null时的默认值

           Mapper.Reset();

           Name name10 = new Name() { FirstName = "L" };

           Mapper.CreateMap<Name, NameDto>()

               .ForMember(name => name.LastName, opt => opt.NullSubstitute("jz"));

           NameDto nameDto10 = Mapper.Map<Name, NameDto>(name10);

           Console.WriteLine("10");

           Console.WriteLine(nameDto10.LastName);

           Console.WriteLine();

           //Console.ReadKey();


           //其它设置与特性

           //11.转换匿名对象

           Mapper.Reset();

           object name11 = new { FirstName = "L", LastName = "jz" };

           NameDto nameDto11 = Mapper.DynamicMap<NameDto>(name11);

           Console.WriteLine("11");

           Console.WriteLine(nameDto11.FirstName + nameDto11.LastName);

           Console.WriteLine();

           //Console.ReadKey();


           //12.转换DataTable

           Mapper.Reset();

           DataTable dt = new DataTable();

           dt.Columns.Add("FirstName", typeof(string));

           dt.Columns.Add("LastName", typeof(string));

           dt.Rows.Add("L", "jz");

           List<NameDto> nameDto12 = Mapper.DynamicMap<IDataReader, List<NameDto>>(dt.CreateDataReader());

           Console.WriteLine("12");

           Console.WriteLine(nameDto12[0].FirstName + nameDto12[0].LastName);

           Console.WriteLine();

           //Console.ReadKey();

           //emitMapper error

           //List<NameDto> nameDto20 = EmitMapper.ObjectMapperManager.DefaultInstance.GetMapper<IDataReader, List<NameDto>>().Map(dt.CreateDataReader());



           //13.转化存在的对象

           Mapper.Reset();

           Mapper.CreateMap<Name, NameDto>()

               .ForMember(name => name.LastName, opt => opt.Ignore());

           Name name13 = new Name() { FirstName = "L" };

           NameDto nameDto13 = new NameDto() { LastName = "jz" };

           Mapper.Map<Name, NameDto>(name13, nameDto13);

           //nameDto13 = Mapper.Map<Name, NameDto>(name13);//注意,必需使用上面的写法,不然nameDto13对象的LastName属性会被覆盖

           Console.WriteLine("13");

           Console.WriteLine(nameDto13.FirstName + nameDto13.LastName);

           Console.WriteLine();

           //Console.ReadKey();


           //14.Flatten特性

           Mapper.Reset();

           Mapper.CreateMap<Store, FlattenName>();

           Store store2 = new Store() { Name = new Name() { FirstName = "L", LastName = "jz" } };

           FlattenName nameDto14 = Mapper.Map<Store, FlattenName>(store2);

           Console.WriteLine("14");

           Console.WriteLine(nameDto14.NameFirstname + nameDto14.NameLastName);

           Console.WriteLine();

           //Console.ReadKey();


           //15.将Dictionary转化为对象,现在还不支持

           Mapper.Reset();

           Mapper.CreateMap<Dictionary<string, object>, Name>();

           Dictionary<string, object> dict = new Dictionary<string, object>();

           dict.Add("FirstName", "L");

           //Name name15 = Mapper.DynamicMap<Dictionary<string, object>, Name>(dict);

           Name name15 = Mapper.Map<Dictionary<string, object>, Name>(dict);

           Console.WriteLine("15");

           Console.WriteLine(name15.FirstName);

           Console.WriteLine();

           Console.ReadKey();

       }

   }


   

   public class Store

   {

       public Name Name { get; set; }

       public int Age { get; set; }

   }


   public class Name

   {

       public string FirstName { get; set; }

       public string LastName { get; set; }

   }


   public class StoreDto

   {

       public NameDto Name { get; set; }

       public int Age { get; set; }

   }


   public class NameDto

   {

       public string FirstName { get; set; }

       public string LastName { get; set; }

       public string AllName { get; set; }

   }


   public class FlattenName

   {

       public string NameFirstname { get; set; }

       public string NameLastName { get; set; }

   }


   public class NameConverter : TypeConverter<Name, NameDto>

   {

       protected override NameDto ConvertCore(Name source)

       {

           return new NameDto() { AllName = source.FirstName + source.LastName };

       }

   }


   public class NameResolver : ValueResolver<Name, NameDto>

   {

       protected override NameDto ResolveCore(Name source)

       {

           return new NameDto() { FirstName = source.FirstName, LastName = source.LastName };

       }

   }


   public class NameFormatter : ValueFormatter<NameDto>

   {

       protected override string FormatValueCore(NameDto name)

       {

           return name.FirstName + name.LastName;

       }

   }


   public class StringFormatter : ValueFormatter<string>

   {

       protected override string FormatValueCore(string name)

       {

           return name + "-";

       }

   }

}

复制代码

复制代码






     比较遗憾的是现在还不支持将Directory转化为对象


     参考的文章:


   使用AutoMapper实现Dto和Model的自由转换

   AutoMapper使用笔记

   博客园现代化建设——AutoMapper

   EmitMapper,AutoMapper,NLiteMapper和手工映射性能大比拼

   Can Automapper map from a Dictionary of properties to a flat destination?

   6