• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

    .NET core高性能對(duì)象轉(zhuǎn)換示例代碼

    來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:34:56
    文檔

    .NET core高性能對(duì)象轉(zhuǎn)換示例代碼

    .NET core高性能對(duì)象轉(zhuǎn)換示例代碼:前言 NET Core(開放源代碼,跨平臺(tái),x-copy可部署等)有許多令人興奮的方面,其中最值得稱贊的就是其性能了。關(guān)于對(duì)象轉(zhuǎn)換已經(jīng)有不少輪子(AutoMapper,TinyMapper) .出于項(xiàng)目需要,手動(dòng)造一個(gè)簡單輪子。下面話不多說了,來一起看看詳細(xì)的介紹吧。 示例代碼 g&
    推薦度:
    導(dǎo)讀.NET core高性能對(duì)象轉(zhuǎn)換示例代碼:前言 NET Core(開放源代碼,跨平臺(tái),x-copy可部署等)有許多令人興奮的方面,其中最值得稱贊的就是其性能了。關(guān)于對(duì)象轉(zhuǎn)換已經(jīng)有不少輪子(AutoMapper,TinyMapper) .出于項(xiàng)目需要,手動(dòng)造一個(gè)簡單輪子。下面話不多說了,來一起看看詳細(xì)的介紹吧。 示例代碼 g&

    前言

    NET Core(開放源代碼,跨平臺(tái),x-copy可部署等)有許多令人興奮的方面,其中最值得稱贊的就是其性能了。關(guān)于對(duì)象轉(zhuǎn)換已經(jīng)有不少輪子(AutoMapper,TinyMapper) .出于項(xiàng)目需要,手動(dòng)造一個(gè)簡單輪子。下面話不多說了,來一起看看詳細(xì)的介紹吧。

    示例代碼

    g>1.采用靜態(tài)泛型類緩存,避免了拆箱裝箱操作。

    2.對(duì)于轉(zhuǎn)換對(duì)象中有,字段名一樣但是類型不一樣的類時(shí)仍可以用

    public static class Mapper<TSource, TTarget> where TSource : class where TTarget : class
     {
     public readonly static Func<TSource, TTarget> Map;
    
     static Mapper()
     {
     if (Map == null)
     Map = GetMap();
     }
    
     private static Func<TSource, TTarget> GetMap()
     {
     var sourceType = typeof(TSource);
     var targetType = typeof(TTarget);
    
     var parameterExpression = Expression.Parameter(sourceType, "p");
     var memberInitExpression = GetExpression(parameterExpression, sourceType, targetType);
    
     var lambda = Expression.Lambda<Func<TSource, TTarget>>(memberInitExpression, parameterExpression);
     return lambda.Compile();
     }
    
     /// <summary>
     /// 根據(jù)轉(zhuǎn)換源和目標(biāo)獲取表達(dá)式樹
     /// </summary>
     /// <param name="parameterExpression">表達(dá)式參數(shù)p</param>
     /// <param name="sourceType">轉(zhuǎn)換源類型</param>
     /// <param name="targetType">轉(zhuǎn)換目標(biāo)類型</param>
     /// <returns></returns>
     private static MemberInitExpression GetExpression(Expression parameterExpression, Type sourceType, Type targetType)
     {
     var memberBindings = new List<MemberBinding>();
     foreach (var targetItem in targetType.GetProperties().Where(x => x.PropertyType.IsPublic && x.CanWrite))
     {
     var sourceItem = sourceType.GetProperty(targetItem.Name);
    
     //判斷實(shí)體的讀寫權(quán)限
     if (sourceItem == null || !sourceItem.CanRead || sourceItem.PropertyType.IsNotPublic)
     continue;
    
     //標(biāo)注NotMapped特性的屬性忽略轉(zhuǎn)換
     if (sourceItem.GetCustomAttribute<NotMappedAttribute>() != null)
     continue;
    
     var propertyExpression = Expression.Property(parameterExpression, sourceItem);
    
     //判斷都是class 且類型不相同時(shí)
     if (targetItem.PropertyType.IsClass && sourceItem.PropertyType.IsClass && targetItem.PropertyType != sourceItem.PropertyType)
     {
     if (targetItem.PropertyType != targetType)//防止出現(xiàn)自己引用自己無限遞歸
     {
     var memberInit = GetExpression(propertyExpression, sourceItem.PropertyType, targetItem.PropertyType);
     memberBindings.Add(Expression.Bind(targetItem, memberInit));
     continue;
     }
     }
    
     if (targetItem.PropertyType != sourceItem.PropertyType)
     continue;
    
     memberBindings.Add(Expression.Bind(targetItem, propertyExpression));
     }
     return Expression.MemberInit(Expression.New(targetType), memberBindings);
     }
     }

    3.調(diào)用方法如下

     (1)構(gòu)造樣例類

    public class A
    {
     public int Id { get; set; }
     public string Name { get; set; }
     public C User { get; set; }
     
     /// <summary>
     /// 標(biāo)注為notmapped特性時(shí),不轉(zhuǎn)換賦值
     /// </summary>
     [System.ComponentModel.DataAnnotations.Schema.NotMapped]
     public D UserA { get; set; }
     
    }
     
    public class B
    {
     public int Id { get; set; }
     public string Name { get; set; }
     public D User { get; set; }<br data-filtered="filtered">
     public D UserA { get; set; }
    }
     
    public class C
    {
     public int Id { get; set; }
     public string Name { get; set; }
    }
     
    public class D
    {
     public int Id { get; set; }
     public string Name { get; set; }
    }

      (2) 調(diào)用

    var a = new A
    {
     Id = 1,
     Name = "張三",
     User = new C
     {
     Id = 1,
     Name = "李四"
     }
    };<br>
    B b = Mapper<A, B>.Map(a);//得到轉(zhuǎn)換結(jié)果

    4.性能測試

    var length = 10000000;
     var listA = new List<A>();
     for (int i = 0; i < length; i++)
     {
     listA.Add(new A
     {
     Id = i,
     Name = "張三",
     User = new C
     {
     Id = i,
     Name = "李四"
     }
     });
     }
    
     var sw = Stopwatch.StartNew();
     for (int i = 0; i < length; i++)
     {
     var item = listA[i];
     var b = new B
     {
     Id = item.Id,
     Name = item.Name,
     User = new D
     {
     Id = i,
     Name = "李四",
     }
     };
     }
     sw.Stop();
     Console.WriteLine($"原生的時(shí)間:{sw.ElapsedMilliseconds}ms");
    
     //表達(dá)式
     Mapper<A, B>.Map(listA[0]);//預(yù)先編譯緩存
     sw.Restart();
     for (int i = 0; i < length; i++)
     {
     Mapper<A, B>.Map(listA[i]);
     }
     sw.Stop();
     Console.WriteLine($"表達(dá)式的時(shí)間:{sw.ElapsedMilliseconds}ms");
    
     //AutoMapper
     AutoMapper.Mapper.Initialize(cfg => cfg.CreateMap<A, B>());
     sw.Restart();
     for (int i = 0; i < length; i++)
     {
     var b = AutoMapper.Mapper.Map<B>(listA[i]);
     }
     sw.Stop();
     Console.WriteLine($"AutoMapper時(shí)間:{sw.ElapsedMilliseconds}ms");
    
     //TinyMapper
     TinyMapper.Bind<A, B>();
     sw.Restart();
     for (int i = 0; i < length; i++)
     {
     var b = TinyMapper.Map<B>(listA[i]);
     }
     sw.Stop();
     Console.WriteLine($"TinyMapper時(shí)間:{sw.ElapsedMilliseconds}ms");
    
     Console.ReadLine();

    5. 1000萬數(shù)據(jù)不帶子類集結(jié)果

    6. 1000萬數(shù)據(jù)帶子類集結(jié)果 

    總結(jié)

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    .NET core高性能對(duì)象轉(zhuǎn)換示例代碼

    .NET core高性能對(duì)象轉(zhuǎn)換示例代碼:前言 NET Core(開放源代碼,跨平臺(tái),x-copy可部署等)有許多令人興奮的方面,其中最值得稱贊的就是其性能了。關(guān)于對(duì)象轉(zhuǎn)換已經(jīng)有不少輪子(AutoMapper,TinyMapper) .出于項(xiàng)目需要,手動(dòng)造一個(gè)簡單輪子。下面話不多說了,來一起看看詳細(xì)的介紹吧。 示例代碼 g&
    推薦度:
    標(biāo)簽: 代碼 對(duì)象 源代碼
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 少妇亚洲免费精品| 亚洲国产成人精品无码久久久久久综合 | 久久精品亚洲男人的天堂| 国产综合色在线精品| 麻豆精品三级全部视频| 精品伦精品一区二区三区视频| 国产成人精品日本亚洲直接| 精品久久人妻av中文字幕| 亚洲国产午夜中文字幕精品黄网站 | 久久亚洲日韩精品一区二区三区| 免费国产在线精品一区| 国产精品 羞羞答答在线| 国产高清在线精品一区| 日韩精品少妇无码受不了| 欧美亚洲综合免费精品高清在线观看| 国产高清精品一区| 精品一卡2卡三卡4卡免费视频| 99久久99这里只有免费费精品| 日本一卡精品视频免费| 亚洲欧洲精品无码AV| 亚洲精品欧美精品日韩精品 | 亚洲精品视频久久久| 日韩精品成人a在线观看| 国产午夜精品理论片久久| 粉嫩精品美女国产在线观看| 亚洲嫩草影院久久精品| 国产精品日韩欧美制服| www国产精品| 99精品免费视频| 精品国产一区二区三区无码| 精品人妻中文字幕有码在线| 国产午夜精品一区二区三区 | 久久久久久亚洲精品无码| 国产精品午夜一级毛片密呀 | 香港三级精品三级在线专区| 亚洲国产综合精品一区在线播放 | 国产成人精品cao在线| 色播精品免费小视频| 国产亚洲综合成人91精品| 日本aⅴ精品中文字幕| 自拍偷在线精品自拍偷无码专区|