.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的具体适用场景,如果还有什么场景,大家可以评论一起讨论.
标签:
c# .net core
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?