.NET Source Generator的浅谈

这个技术也相对比较成熟了 最近也稍微了解了下 以下是我的个人浅谈

没这个技术之前 你要写一个代码生成器原理就是搞一个模版文件,然后生成一种字符串格式的代码

        /// <summary>
        /// {desc}
        /// </summary>
        public {proptype}{null} {propname} { get; set; }
复制代码
//伪代码
foreach (var x in dbDatas) { x.Comment = x.Comment.Replace("\r\n", " "); var isnull = x.Null.Equals("NO") == true ? "" : "?"; isnull = Help.ChangeType(x.Type).Equals("string") == true ? "" : isnull; var tempstr = File.ReadAllText($"{Help.Dir}DbModel属性") .Replacekuohao("desc", x.Comment) .Replacekuohao("propname", x.Field) .Replacekuohao("null", isnull) .Replacekuohao("proptype", Help.ChangeType(x.Type)); data += tempstr; }
复制代码

 

例如我现在自己在用的这个模版,查询数据库,然后生成对应的实体类(ps.比如EF可以DbFirst也可以生成实体类代码,我这里是纯粹想写着玩)

我这边会直接生成一个.cs文件(反正原理都是生成一份.Net格式的字符串代码)

然后再把这份字符串改成.cs文件,就等于是一个简单的代码生成器了

回归主题,这个技术的适用场景在哪呢?难不成只是说我不用最后一步把代码变换成.cs格式吗?

接下来我从Dto映射这个功能切入说明.

传统开发里Dto和原始类的映射可以通过以下方式

1.使用autoMapper等框架自动映射

var  _mapper = new Mapper(
     new MapperConfiguration(x =>
     {
         x.CreateMap<FatherClass, SonClass>().ReverseMap();
     })
 );
 var son = _mapper.Map<SonClass>(fatherClass);

2.编写手动映射代码

复制代码
 SonClass son = new()
 {
     Id=fatherClass.Id,
     CreateEmployeeId= fatherClass.CreateEmployeeId,
     CreateTime=fatherClass.CreateTime,
     EnterpriseId= fatherClass.EnterpriseId,
     IsDelete= fatherClass.IsDelete,
     LastUpdateEmployeeId= fatherClass.LastUpdateEmployeeId,
     LastUpdateTime= fatherClass.LastUpdateTime
 };
复制代码

然后跑下性能测试

 可以看到 第2种手动赋值的性能吊打autoMapper 

那么肯定用第2种好啊,性能吊打. 但是你假如加了个属性,是不是最少还要在补上一行代码.

这样就很浪费开发时间了.所以微软就推出Source Generator这个功能了 

它可以在编译阶段就生成第2种方法的代码,你就不用手动编写了,因此映射的效率就是手动编写的效率,而且微软有些Source Generator的方法还有额外优化(比如日志功能,具体可以看.NET性能优化-使用SourceGenerator-Logger记录日志 - InCerry - 博客园 (cnblogs.com))

这是一个Source Generator的具体适用场景,如果还有什么场景,大家可以评论一起讨论.

posted @   大大只植物  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示