首页 > 其他分享 >利用dotnet core的代码生成实现类型转换

利用dotnet core的代码生成实现类型转换

时间:2023-06-13 15:44:59浏览次数:35  
标签:类型转换 代码生成 return core get Dic null public MyProperty

利用dotnet core的代码生成的特性,自动生成类型转换的代码。类似于AutoMaper,但是代码生成近似于手写代码,不用反射,性能更好

生成通过比较属性名字(不区分大小写)

属性支持简单类型,类,List,Dictionary(key最好是string类型)

在需要转换的类上标记特性:ConvertFrom、ConvertTo

    [ConvertTo(typeof(B))]
    [ConvertFrom(typeof(B))]
    public partial class A
    {
        public int Age { get; set; }
        public Dictionary<string, A2> Dic { get; set; }
    }
    public partial class A2
    {
        public int MyProperty { get; set; }
    }

    public class B
    {
        public int Age { get; set; }
        public Dictionary<string,B2> Dic { get; set; }
    }

    public class B2
    {
        public int MyProperty { get; set; }
    }

  

上面的例子生成如下代码:

	public partial class A
	{
		public static A ConvertFrom(ConverterTest.B item)
		{
			if(item != null) 
			{
				var r = new ConverterTest.A();
				r.Age = item.Age;
				if(item.Dic != null) r.Dic = item.Dic.ToDictionary(a => a.Key, b => 
				{
					if(b.Value != null) 
					{
						var c2 = new ConverterTest.A2();
						c2.MyProperty = b.Value.MyProperty;
						return c2;
					} else return null;
				});
				return r;
			} else return null;

		}
		public static List<A> ConvertListFrom(IList<ConverterTest.B> items) => items.Select(p => A.ConvertFrom(p)).ToList();

	}

	public partial class A
	{
		public ConverterTest.B ConvertToB()
		{
			if(this != null) 
			{
				var r = new ConverterTest.B();
				r.Age = this.Age;
				if(this.Dic != null) r.Dic = this.Dic.ToDictionary(a => a.Key, b =>  
				{
					if(b.Value != null) 
					{
						var c2 = new ConverterTest.B2();
						c2.MyProperty = b.Value.MyProperty;
						return c2;
					} else return null;
				});
				return r;
			} else return null;

		}
		public static List<ConverterTest.B> ConvertListTo(IList<ConverterTest.A> items) => items.Select(p => p.ConvertToB()).ToList();

	}

  

实现是很直接的,就是拼接代码。之前的实现是继承ISourceGenerator,后面有了一个IIncrementalGenerator,后者性能更高(利用了缓存),就换了实现

具体实现可以在这里看:https://gitee.com/di-ao/convert-generator

标签:类型转换,代码生成,return,core,get,Dic,null,public,MyProperty
From: https://www.cnblogs.com/a14907/p/17477733.html

相关文章

  • (转)我所理解的Entitas——Jenny代码生成器(序章)
    前(fei)言(hua)使用Entitas集成的代码生成器时如果代码有报错需要先把报错处理掉。如果我们是想删除某个Component或者修改Component中数据类型时就很麻烦。使用Jenny代码生成器时则不用理会这些,直接删除某个Component然后重新生成就行。获取JennyAssetStore导入Entitas时会带有J......
  • NET CORE Configuraion 使用详解 获取配置文件参数 读取环境变量、读取配置文件、读取
    NETCOREConfiguraion使用详解获取配置文件参数读取环境变量、读取配置文件、读取Ini配置、读取Xml配置、多源配置读取顺序分析https://blog.csdn.net/qq_32109957/article/details/127998326相关配置<ProjectSdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Ex......
  • ASP.NET Core 6框架揭秘实例演示[37]:重定向的N种实现方式
    在HTTP的语义中,重定向一般指的是服务端通过返回一个状态码为3XX的响应促使客户端像另一个地址再次发起请求,本章将此称为“客户端重定向“。既然有客户端重定向,自然就有服务端重定向,本章所谓的服务端重定向指的是在服务端通过改变请求路径将请求导向另一个终结点。ASP.NET下的重定......
  • Vert.x Core解析
    希望通过本文的解析,让读者了解Vertx的关键部分的实现原理。对诸如如下问题有一个具象的认识。Vertx实例的作用?一个应用是否只对应一个Vertx实例?Verticle是一个怎样的存在?本地模式下消息是如何在EventBus上传输和响应的?EventBus和EventLoop是如何关联起来的?概述Vert.x是一个事件驱......
  • .net core 微服务 集成Ocelot 和Nacos 之后使用grpc 如何实现服务与服务之间的调用
    在.NETCore微服务中使用gRPC调用其他服务,你需要完成以下步骤:1.定义服务契约:你需要定义你的服务、方法以及消息类型,以便客户端和服务端协商通信。2.生成代码:你需要使用gRPC工具生成客户端和服务端的代码,这样你就可以在应用程序中使用它们。3.实现服务:你需要实现......
  • 目录-理解ASP.NET Core
    《理解ASP.NETCore》基于.NET5&.NET6进行整理,旨在帮助大家能够对.NET&ASP.NETCore框架有一个清晰的认识。目录Startup中间件(Middleware)依赖注入(DependencyInjection)主机(Host)配置(Configuration)选项(Options)路由(Routing)文件服务器(FileServer)日......
  • 龙芯下如何进行.net core程序开发部署
    龙芯LoongArch64已经发布了对.NETCore的支持,相关工具链也已完成,目前支持.NETCore3.1、.NET6、.NET7版本。本文以.NETCore3.1在loongnix-server8.4下部署为例说明开发部署过程。.NETCore3.1是基于上游社区.NETCore3.1-LTS-SDK制作的,同样是LTS版本。1、在龙芯开源社区下载安装.net......
  • 使用thop和fvcore计算MACs和FLOPs
     一、计算量常使用乘加计算数衡量,英文为multiply-accumulateoperations或multiply-addoperations,因此常缩写为MACs,MACC或MADD。由于乘加计算的底层是通过浮点运算实现的,因此还可使用浮点运算数来表示计算量。浮点计算数,英文为FloatOperations,常缩写为FLOPs。描述了数据......
  • 理解ASP.NET Core - 全球化&本地化&多语言(Globalization and Localization)
    注:本文隶属于《理解ASP.NETCore》系列文章,请查看置顶博客或点击此处查看全文目录概述在众多知名品牌的网站中,比如微软官网、YouTube等,我们经常可以见到“切换页面语言”的功能,我们可以选择最适合的语言浏览页面内容。毫无疑问,为网站提供多种语言,页面内容本地化,大大扩展了受众......
  • mybatis-plus-generator-ui 可视化代码生成器!
    它提供交互式的WebUI用于生成兼容mybatis-plus框架的相关功能代码,包括Entity,Mapper,Mapper.xml,Service,Controller等。可以自定义模板以及各类输出参数,也可通过SQL查询语句直接生成代码。git地址:https://github.com/davidfantasy/mybatis-plus-generator-ui一、使用示例1......