c# automapper 使用

一、最簡單的用法

有兩個類User和UserDto

復制代碼
 1     public class User2     {3         public int Id { get; set; }4         public string Name { get; set; }5         public int Age { get; set; }6     }7 8     public class UserDto9     {
10         public string Name { get; set; }
11         public int Age { get; set; }
12     }
復制代碼

將User轉換成UserDto也和簡單

復制代碼
1     Mapper.Initialize(x => x.CreateMap<User, UserDto>());
2     User user = new User()
3     {
4         Id = 1,
5         Name = "caoyc",
6         Age = 20
7     };
8     var dto = Mapper.Map<UserDto>(user);
復制代碼

?這是一種最簡單的使用,AutoMapper會更加字段名稱去自動對于,忽略大小寫。

?

二、如果屬性名稱不同

將UserDto的Name屬性改成Name2

復制代碼
 1     Mapper.Initialize(x => 2         x.CreateMap<User, UserDto>()3          .ForMember(d =>d.Name2, opt => {4             opt.MapFrom(s => s.Name);5             })6         );7 8     User user = new User()9     {
10         Id = 1,
11         Name = "caoyc",
12         Age = 20
13     };
14 
15     var dto = Mapper.Map<UserDto>(user);
復制代碼

?

三、使用Profile配置

自定義一個UserProfile類繼承Profile,并重寫Configure方法

復制代碼
 1     public class UserProfile : Profile2     {3         protected override void Configure()4         {5             CreateMap<User, UserDto>()6                 .ForMember(d => d.Name2, opt =>7                 {8                     opt.MapFrom(s => s.Name);9                 });
10         }
11     }
復制代碼

使用時就這樣

復制代碼
 1     Mapper.Initialize(x => x.AddProfile<UserProfile>());2 3     User user = new User()4     {5         Id = 1,6         Name = "caoyc",7         Age = 208     };9 
10     var dto = Mapper.Map<UserDto>(user);
復制代碼

?

四、空值替換NullSubstitute

空值替換允許我們將Source對象中的空值在轉換為Destination的值的時候,使用指定的值來替換空值。

復制代碼
 1     public class UserProfile : Profile2     {3         protected override void Configure()4         {5             CreateMap<User, UserDto>()6                 .ForMember(d => d.Name2, opt => opt.MapFrom(s => s.Name))7                 .ForMember(d => d.Name2, opt => opt.NullSubstitute("值為空"));8                 9         }
10     }
復制代碼
復制代碼
1     Mapper.Initialize(x => x.AddProfile<UserProfile>());
2 
3     User user = new User()
4     {
5         Id = 1,
6         Age = 20
7     };
8 
9     var dto = Mapper.Map<UserDto>(user);
復制代碼

結果為:

?

五、忽略屬性Ignore

復制代碼
 1     public class User2     {3         public int Id { get; set; }4         public string Name { get; set; }5         public int Age { get; set; }6     }7 8     public class UserDto9     {
10         public string Name { get; set; }
11         public int Age { get; set; }
12 
13     }
14 
15     public class UserProfile : Profile
16     {
17         protected override void Configure()
18         {
19             CreateMap<User, UserDto>().ForMember("Name", opt => opt.Ignore());
20         }
21     }
復制代碼

使用

復制代碼
 1     Mapper.Initialize(x => x.AddProfile<UserProfile>());2 3     User user = new User()4     {5         Id = 1,6         Name="caoyc",7         Age = 208     };9 
10     var dto = Mapper.Map<UserDto>(user);
復制代碼

結果:

?

六、預設值

如果目標屬性多于源屬性,可以進行預設值

復制代碼
 1     public class User2     {3         public int Id { get; set; }4         public string Name { get; set; }5         public int Age { get; set; }6     }7 8     public class UserDto9     {
10         public string Name { get; set; }
11         public int Age { get; set; }
12         public string Gender { get; set; }
13 
14     }
15 
16     public class UserProfile : Profile
17     {
18         protected override void Configure()
19         {
20             CreateMap<User, UserDto>();
21         }
22     }
復制代碼

使用

復制代碼
 1     Mapper.Initialize(x => x.AddProfile<UserProfile>());2 3     User user = new User()4     {5         Id = 1,6         Name="caoyc",7         Age = 208     };9 
10     UserDto dto = new UserDto() {Gender = "男"};
11     Mapper.Map(user, dto);
復制代碼

?七、類型轉換ITypeConverter

如果數據中Gender存儲的int類型,而DTO中Gender是String類型

復制代碼
1     public class User
2     {
3         public int Gender { get; set; }
4     }
5 
6     public class UserDto
7     {
8         public string Gender { get; set; }
9     }
復制代碼

類型轉換類,需要實現接口ITypeConverter

復制代碼
 1     public class GenderTypeConvertert : ITypeConverter<int, string>2     {3         public string Convert(int source, string destination, ResolutionContext context)4         {5             switch (source)6             {7                 case 0:8                     destination = "男";9                     break;
10                 case 1:
11                     destination = "女";
12                     break;
13                 default:
14                     destination = "未知";
15                     break;
16             }
17             return destination;
18         }
19     }
復制代碼

配置規則

復制代碼
 1     public class UserProfile : Profile2     {3         protected override void Configure()4         {5             CreateMap<User, UserDto>();6 7             CreateMap<int, string>().ConvertUsing<GenderTypeConvertert>();8             //也可以寫這樣9             //CreateMap<int, string>().ConvertUsing(new GenderTypeConvertert());
10         }
11     }
復制代碼

使用

復制代碼
 1     Mapper.Initialize(x => x.AddProfile<UserProfile>());2 3     User user0 = new User() { Gender = 0 };4     User user1 = new User() { Gender = 1 };5     User user2 = new User() { Gender = 2 };6     var dto0= Mapper.Map<UserDto>(user0);7     var dto1 = Mapper.Map<UserDto>(user1);8     var dto2 = Mapper.Map<UserDto>(user2);9 
10     Console.WriteLine("dto0:{0}", dto0.Gender);
11     Console.WriteLine("dto1:{0}", dto1.Gender);
12     Console.WriteLine("dto2:{0}", dto2.Gender);
復制代碼

結果

?

八、條件約束Condition

當滿足條件時才進行映射字段,例如人類年齡,假設我們現在人類年齡范圍為0-200歲(這只是假設),只有滿足在這個條件才進行映射

DTO和Entity

復制代碼
1     public class User
2     {
3         public int Age { get; set; }
4     }
5 
6     public class UserDto
7     {
8         public int Age { get; set; }
9     }
復制代碼

Profile

復制代碼
1     public class UserProfile : Profile
2     {
3         protected override void Configure()
4         {
5             CreateMap<User, UserDto>().ForMember(dest=>dest.Age,opt=>opt.Condition(src=>src.Age>=0 && src.Age<=200));
6         }
7     }
復制代碼

使用代碼

復制代碼
 1     Mapper.Initialize(x => x.AddProfile<UserProfile>());2 3     User user0 = new User() { Age = 1 };4     User user1 = new User() { Age = 150 };5     User user2 = new User() { Age = 201 };6     var dto0= Mapper.Map<UserDto>(user0);7     var dto1 = Mapper.Map<UserDto>(user1);8     var dto2 = Mapper.Map<UserDto>(user2);9 
10     Console.WriteLine("dto0:{0}", dto0.Age);
11     Console.WriteLine("dto1:{0}", dto1.Age);
12     Console.WriteLine("dto2:{0}", dto2.Age);
復制代碼

輸出結果

?

?

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
using AutoMapper;  
using System.Data;  namespace ConsoleApplication2  
{  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))  .ForMember(name => name.FirstName, opt => opt.MapFrom(name=>name.FirstName));  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特性 Store.Name.FirtName=FlattenName.NameFirstname  
            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,AllName=source.FirstName+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 + "-";  }  }  
}  

?

轉載于:https://www.cnblogs.com/vaevvaev/p/7080423.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254256.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254256.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254256.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

js正則歸納

/* * 正則的緩存區 * 一、 var numadb1122;var reg/(\d)\1(\d)\2/gi;console.log(num.match(reg));//[ 1122 ]二、普通字符&#xff1a;a b c 1 2 3 特殊字符&#xff1a;\d \w \D //w d 是什么三、元字符中限定符* &#xff1a; 匹配0到多 &#xff1a; 匹配1到…

洛谷 P1469 找筷子

題目描述 經過一段時間的緊張籌備&#xff0c;電腦小組的“RP餐廳”終于開業了&#xff0c;這天&#xff0c;經理LXC接到了一個定餐大單&#xff0c;可把大家樂壞了&#xff01;員工們齊心協力按要求準備好了套餐正準備派送時&#xff0c;突然碰到一個棘手的問題&#xff0c;筷…

玩轉C#控件-常用控件屬性

文章目錄概述Control類的基本屬性1、Name屬性2、Text屬性3、Anchor屬性4、Dock屬性Control類的方法和事件博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 概述 控件是包含在窗體上的對象&#xff0c;是構成用戶界面的基本元素&#xff0c;也是…

LazyT 提供對延遲初始化的支持

延遲初始化 就是在第一次使用的時候在 進行類的初始化 public class Student{public Student(){this.Name "DefaultName";this.Age 0;Console.WriteLine("Student is init...");}public string Name { get; set; }public int Age { get; set; }} public…

264標準中高復雜度的三方面

一、運功估計搜索 二、碼率控制 三、濾波算法 在264中&#xff0c;這三方面占據了絕大部分的計算復雜度。具體原因或是優化的具體步驟有時間補上。

ie瀏覽器不支持多行隱藏顯示省略號

平時在寫頁面過程中&#xff0c;相信大家都遇到過文本顯示多行后用省略號代替的問題&#xff0c;來看看代碼&#xff1a; p{display: -webkit-box;overflow: hidden;text-overflow: ellipsis;-webkit-line-clamp:12;//表示顯示12行之后用省略號代替-webkit-box-orient:vertical…

API設計原則 - Qt官網的設計實踐總結

原文鏈接&#xff1a;API Design Principles - Qt Wiki 基于Gary的影響力上 Gary Gao 的譯文稿&#xff1a;C的API設計指導 譯文發在酷殼 - CoolShell&#xff1a;API設計原則&#xff0c; 2017-07-25 API設計原則 - Qt官網的設計實踐總結 &#x1f34e; 譯序 Qt的設計水準在業…

python帶參裝飾器的改良版

簡單點就是這種 def deco2(param1):def _deco2(fun):def __deco2(*args, **kwargs):print (param)fun(*args, **kwargs)return __deco2return _deco2deco2 # 錯誤的寫法 def f2(strx):print (strx)f2(hello) 運行上面這個&#xff0c;期待打印1和hello 實際上是不…

H.264邊緣塊進行幀內預測時,上邊緣和左邊緣塊的預測情況。

僅僅介紹上邊緣塊需要用到上面的像素&#xff08;不存在&#xff09;&#xff08;例如垂直模式&#xff09;&#xff0c;左邊緣快需要用到左邊的像素&#xff08;不存在&#xff09;&#xff08;例如水平模式&#xff09;的情況。 H.264 I幀邊緣塊的處理 I幀的第一個左上的邊緣…

P1021 郵票面值設計

P1021 郵票面值設計 題目描述 給定一個信封&#xff0c;最多只允許粘貼N張郵票&#xff0c;計算在給定K&#xff08;NK≤15&#xff09;種郵票的情況下&#xff08;假定所有的郵票數量都足夠&#xff09;&#xff0c;如何設計郵票的面值&#xff0c;能得到最大值MAX&#xff0c…

第七章:XAML vs. code(3)

屬性元素語法這里有一些C&#xff03;與第4章中的FramedText代碼相似。在一個語句中&#xff0c;它實例化一個Frame和一個Label&#xff0c;并將Label設置為Frame的Content屬性&#xff1a; new Frame {OutlineColor Color.Accent,HorizontalOptions LayoutOptions.Center,Ve…

QtCreator5.12.6安裝圖文教程

前言接觸過Qt的同學肯定用過QtCreator,本id最近常用&#xff0c;也就寫個教程記錄一下安裝的過程。可能比較少人學過Qt&#xff0c;感覺Qt還是挺不錯的&#xff0c;做出來的界面還算好看&#xff0c;關鍵是跨平臺。說明&#xff1a;安裝的系統&#xff1a;win10專業版QtCreator…

H.264學習(一)——幀和場的概念

一、何謂場&#xff1f; 每個電視幀都是通過掃描屏幕兩次而產生的&#xff0c;第二個掃描的線條剛好填滿第一次掃描所留下的縫隙。每個掃描即稱為一個場。因此 25 幀/秒的電視畫面實際上為 50 場/秒 (若為 NTSC 則分別為 30 & 60 - 因為我是中國人&#xff0c;因此我采用 P…

【實踐】js實現隨機不重復抽取數組中元素

經過3個星期的時間終于用做完了學校的練習作品了&#xff0c;但是發現在用jq 做互動雖然很方便但卻帶來了不少的煩惱 所以在以后的日子里我要好好學 js 了&#xff01; 然后呢在博主之前學java 里面 另我最頭痛的就是做產生隨機不重復的數據了 今天自己再鞏固了一下以前的知識再…

RabbitMQ for windows

一、搭建環境 Rabbit MQ 是建立在強大的Erlang OTP平臺上&#xff0c;因此安裝RabbitMQ之前要先安裝Erlang。 erlang&#xff1a;http://www.erlang.org/download.html rabbitmq&#xff1a;http://www.rabbitmq.com/download.html 我目前使用的&#xff1a;http://pan.baidu.c…

圓環內外圓毛刺(凸起)缺口(凹陷)檢測halcon

文章目錄處理要求處理方法1方法一思路方法一halcon源碼處理效果處理方法2方法二思路方法二halcon源碼處理效果博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 處理要求 橢圓/圓環&#xff08;產品易變形&#xff0c;為橢圓&#xff09;內外圓…

什么是單播、多播和廣播br

什么是單播、多播和廣播   “單播”&#xff08;Unicast&#xff09;、“多播”&#xff08;Multicast&#xff09;和“廣播”&#xff08;Broadcast&#xff09;這三個術語都是用來描述網絡節點之間通訊方式的術語。那么這些術語究竟是什么意思&#xff1f;區別何在&#…

【Oracle Database】數據庫控制文件管理

移動控制文件 [oraclewallet01 ~]$ sqlplus / as sysdba SQL> set line 200 SQL> col name for a60 SQL> select status,name from v$controlfile;STATUS NAME ------- ------------------------------------------------------------/u01/app/oracle/oradata/wallet…

ADO接口簡介

源地址&#xff1a;http://blog.csdn.net/xiaobai1593/article/details/7449151 參考&#xff1a; 1. 百度文庫&#xff1a;http://wenku.baidu.com/view/8e2e99ecf8c75fbfc77db230.html 2. CSDN&#xff1a;http://blog.csdn.net/augusdi/article/details/7005597 接口概述&am…

jquery模擬可輸入的下拉框

//頁面html <div id"select" class"select" ><ul><c:forEach items"${movieCityList}" var"cy" varStatus"st"><li><a href"javascript:void(0)" onclick"selectOption($(this))…