c#通過(guò)反射實(shí)現(xiàn)對(duì)象自動(dòng)映射的實(shí)現(xiàn)
在 C# 中,可以使用 AutoMapper 庫(kù)來(lái)完成對(duì)象之間的映射,而不必手動(dòng)編寫(xiě)顯式的映射代碼。但是,如果你希望通過(guò)反射來(lái)動(dòng)態(tài)完成對(duì)象的映射,你可以編寫(xiě)自己的映射邏輯并使用反射來(lái)完成這個(gè)過(guò)程。
我們?cè)诰幊踢^(guò)程中,經(jīng)常需要將一個(gè)對(duì)象轉(zhuǎn)成另一個(gè)對(duì)象(一般稱(chēng)為對(duì)象映射)。
比如我們有2個(gè)類(lèi):
//第1個(gè)類(lèi) CLS1 class CLS1 { public int i {get; set;} public string str {get; set;} } //第2個(gè)類(lèi) CLS2 class CLS2 { public int i {get; set;} public string str {get; set;} }
兩個(gè)類(lèi)都擁有屬性 i
和 str
。
當(dāng)我們需要將 CLS1 的實(shí)例對(duì)象轉(zhuǎn)化為 CLS2 的實(shí)例對(duì)象時(shí),正常會(huì)這樣操作:
CLS1 obj1 = new CLS1(){i = 1, str = "ss"}; CLS2 obj2 = new CLS2(); //將 obj1 映射為 obj2 obj2.i = obj1.i; //obj2.i = 1; obj2.str = obj1.str; //obj2.str = "ss";
如果屬性多了,寫(xiě)起來(lái)會(huì)很繁瑣,希望可以通過(guò)一個(gè)方法自動(dòng)幫我們解決,比如這樣:
//將 CLS1 的對(duì)象映射為 CLS2 的對(duì)象 obj2 = Mapper.T1MapToT2<CLS1, CLS2>(obj1); //obj2.i = 1; obj2.str = "ss";
下面是一個(gè)簡(jiǎn)單的示例,演示了如何使用反射來(lái)完成對(duì)象之間的映射:
class Program { static void Main() { // 創(chuàng)建源對(duì)象 Person source = new Person { Name = "Alice", Age = 25 }; // 創(chuàng)建目標(biāo)對(duì)象 PersonDto destination = new PersonDto(); destination = source.MapTo<Person, PersonDto>(); // 輸出目標(biāo)對(duì)象的屬性值 Console.WriteLine($"Name: {destination.Name}, Age: {destination.Age}"); } } class Person { public string Name { get; set; } public int Age { get; set; } } class PersonDto { public string Name { get; set; } public int Age { get; set; } } static class AutoMapper { public static TDest MapTo<TSource, TDest>(this TSource source) where TSource : class, new() where TDest : class, new() { // 創(chuàng)建目標(biāo)對(duì)象 TDest destination = new TDest(); // 獲取源對(duì)象的所有屬性 PropertyInfo[] sourceProperties = typeof(TSource).GetProperties(); // 獲取目標(biāo)對(duì)象的所有屬性 PropertyInfo[] destinationProperties = typeof(TDest).GetProperties(); // 使用反射完成對(duì)象的映射 foreach (var sourceProperty in sourceProperties) { foreach (var destinationProperty in destinationProperties) { if (sourceProperty.Name == destinationProperty.Name && sourceProperty.PropertyType == destinationProperty.PropertyType) { // 通過(guò)反射獲取源對(duì)象的屬性值 object value = sourceProperty.GetValue(source); // 通過(guò)反射設(shè)置目標(biāo)對(duì)象的屬性值 destinationProperty.SetValue(destination, value); break; } } } return destination; } }
到此這篇關(guān)于c#通過(guò)反射完成對(duì)象自動(dòng)映射的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)c# 對(duì)象自動(dòng)映射內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#引用類(lèi)型和值類(lèi)型的介紹與實(shí)例
這篇文章主要介紹了C#引用類(lèi)型和值類(lèi)型,有需要的朋友可以參考一下2013-12-12C# 8.0中的范圍類(lèi)型(Range Type)示例詳解
這篇文章主要給大家介紹了關(guān)于C# 8.0中范圍類(lèi)型(Range Type)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12C#解決SQlite并發(fā)異常問(wèn)題的方法(使用讀寫(xiě)鎖)
這篇文章主要介紹了C#解決SQlite并發(fā)異常問(wèn)題的方法,通過(guò)使用讀寫(xiě)鎖達(dá)到多線(xiàn)程安全訪問(wèn),進(jìn)而解決SQLite并發(fā)異常的問(wèn)題,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07c# 調(diào)用Surfer軟件,添加引用的具體操作方法
本篇文章主要是對(duì)c#中調(diào)用Surfer軟件,添加引用的具體操作方法進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-01-01C#創(chuàng)建Windows Service(Windows 服務(wù))的方法步驟
本文介紹了如何用C#創(chuàng)建、安裝、啟動(dòng)、監(jiān)控、卸載簡(jiǎn)單的Windows Service 的內(nèi)容步驟和注意事項(xiàng),具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11