C# 11 新特性:泛型 Attribute

之前

使用JsonConverterAttribute,我们可以为任意类型自定义 Json 序列化。例如:

[JsonConverter(typeof(UserJsonConverter))]
public class User
{public string Name { get; set; }public override string ToString(){return Name;}
}public class UserJsonConverter : JsonConverter<User>
{public override User? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options){//演示代码,不实现具体序列化逻辑reader.Read();return new User { Name = "MyIO" };}
}

反序列时将返回UserConverter生成的 User 实例:

var user = JsonSerializer.Deserialize<User>("{}");

301fedeac120e1eb7b13d0e3f71d8f9b.png

但这不是本文的重点。重点是UserJsonConverter如何被实例化的。

查看JsonConverterAttribute的源码,JsonConverter的类型在构造函数中赋值给了ConverterType属性:

public class JsonConverterAttribute : JsonAttribute
{public JsonConverterAttribute(Type converterType){ConverterType = converterType;} public Type? ConverterType { get; private set; }
}

ConverterType的使用代码如下:

JsonConverter? converter;Type? type = converterAttribute.ConverterType;
if (type == null)
{converter = converterAttribute.CreateConverter(typeToConvert);
}
else
{converter = (JsonConverter)Activator.CreateInstance(type)!;
}

也就是说,JsonConverte实例是通过反射(Activator.CreateInstance(type))生成的。

一般来说,反射的执行效率较低,这时我们注意到if分支,可以用CreateConverter方法创建实例。

修改实现代码如下:

public class UserJsonConverterAttribute : JsonConverterAttribute
{public override JsonConverter? CreateConverter(Type typeToConvert){return new UserJsonConverter();}
}[UserJsonConverterAttribute()]
public class User

同样可以反序列成功,这时使用的是强类型的JsonConverter。

但是,这种方式也有一个缺点,每当我们实现了一个xxJsonConverter,就需要再定义一个xxJsonConverterAttribute

而我们的目的,只是为了创建 JsonConverter 实例,代码逻辑相同,完全可以用范型方式实现。

但是在 C# 11 之前,是不支持这样定义的。

C# 11

在 C# 11 中,可以声明基类为System.Attribute的泛型类。

这样,上面的代码可以改造为如下形式:

public class GenericJsonConverterAttribute<T> : JsonConverterAttribute where T : JsonConverter, new()
{public override JsonConverter? CreateConverter(Type typeToConvert){return new T();}
}[GenericJsonConverter<UserJsonConverter>]
public class User[GenericJsonConverter<OrderJsonConverter>]
public class Order

添加微信号【MyIO666】,邀你加入技术交流群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NA-NP-IE系列实验实验15:RIPv2 手工汇总

实验15&#xff1a;RIPv2 手工汇总1.实验目的 通过本实验可以掌握&#xff1a;&#xff08;1&#xff09;RIPv2 路由的手工汇总&#xff08;2&#xff09;RIPv2 不支持CIDR 汇总&#xff08;3&#xff09;RIPv2 可以传递CIDR 汇总2.拓扑结构 实验拓扑如图 所示。3.实验步骤 路由…

CSS3 做一个旋转的立体3D正方形 动效核心【前端就业课 第二阶段】CSS 零基础到实战(07)

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 一、transform-origin transform-origin 用于更改当前元素的中心点&am…

【微服务专题之】.Net6下集成微服务网关-Ocelot

微信公众号&#xff1a;趣编程ACE关注可了解更多的.NET日常实战开发技巧&#xff0c;如需源码 请公众号后台留言 源码;[如果觉得本公众号对您有帮助&#xff0c;欢迎关注].Net6下集成微服务网关-Ocelot网关常见功能1&#xff1a;路由 routing2: 请求聚合3&#xff1a;身份验证和…

ArcGIS实验教程——实验二十七:时态数据可视化----以飓风路径为例

实验效果预览: ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据)》 文章目录 1. 时态数据简介2. 时态数据的存储方式3. 时态数据显示实例---飓风路径1. 时态数据简介 时态数据 代表某个时间点的状态,如 1990 年香港的土地利用状况或 2009 年 7 月…

02 控制器《ThinkPHP6 入门到电商实战》

文章目录&#xff08;更新中…&#xff09; 01 thinkphp6的前期开发准备《ThinkPHP6 入门到电商实战》 02 控制器《ThinkPHP6 入门到电商实战》 03 数据库查询、模型查询、多库查询《ThinkPHP6 入门到电商实战》 04 tp6 的查数据《ThinkPHP6 入门到电商实战》 05 tp6 的数据添…

聊聊C# CLR中那些大量的友元函数,友元类的底层玩法

一&#xff1a;理解友元 如果你看过 CLR 代码就会发现这里面有很多的 friend 修饰符, 比如: MethodTable.cpp 文件下。class MethodTable {/************************************* FRIEND FUNCTIONS************************************/// DO NOT ADD FRIENDS UNLESS ABSOL…

【详细】长按APP图标弹出快捷方式,ShortCut功能实现

Shortcuts介绍 Android7.1&#xff08;API Level 25&#xff09;及以上系统可以自定义Shortcuts&#xff0c;通过在桌面上长按App Icon弹出Shortcut列表&#xff0c;点击某个shortcut可使用户快捷得打开App里常用的或推荐的任务。国内各个厂商基本上在安卓8.0上集成了该功能。…

ArcGIS实验教程——实验二十八:统计图表(饼状图、柱状图)制作

统计图表(饼状图、柱状图)预览: ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据)》 文章目录 1. 制作图表2. 在地图上显示图表1. 制作图表 加载甘肃行政区划数据。 打开数据的属性表,可以看到有面积、人口、GDP、土地利用等字段。

01 thinkphp6的前期开发准备《ThinkPHP6 入门到电商实战》

本机环境&#xff1a;win10 集成环境&#xff1a;studyphp&#xff08;方便学习使用Windows下集成环境&#xff09; 数据库可视化操作软件&#xff1a;sqlyog 文章目录&#xff08;更新中…&#xff09; 01 thinkphp6的前期开发准备《ThinkPHP6 入门到电商实战》 02 控制器《…

一个Dapr的POC应用

开源了之前开发的一个Dapr的POC应用。地址在&#xff1a;https://github.com/heavenwing/daprapps-poc是以一个供应链的系统&#xff08;的一部分业务&#xff09;作为场景。POC场景很简单&#xff1a;管理部分基础数据实现简单的入库流程&#xff0c;包括申请-收货-入库整个架…

ArcGIS实验教程——实验二十九:ArcGIS制图掩膜工具案例详解

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据)》 实验目录 1. ArcGIS掩膜概述2. 死胡同掩膜3. 要素轮廓线掩膜4. 交叉图层掩膜1. ArcGIS掩膜概述 掩膜是利用遮盖或隐藏要素的视觉处理技术来增强地图表现力的一种技术手段,掩膜实质是包含一些多边…

03 数据库查询、模型查询、多库查询《ThinkPHP6 入门到电商实战》

文章目录&#xff08;更新中…&#xff09; 01 thinkphp6的前期开发准备《ThinkPHP6 入门到电商实战》 02 控制器《ThinkPHP6 入门到电商实战》 03 数据库查询、模型查询、多库查询《ThinkPHP6 入门到电商实战》 04 tp6 的查数据《ThinkPHP6 入门到电商实战》 05 tp6 的数据添…

使用开源工具 k8tz 优雅设置 Kubernetes Pod 时区

容器在主机的内核上运行&#xff0c;并获得时钟&#xff0c;但时区不是来自内核&#xff0c;而是来自用户空间。在大多数情况下&#xff0c;默认使用协调世界时 (UTC)。时区的不一致&#xff0c;会带来很多困扰。即使代码与时区无关&#xff0c;但容器日志与系统日志时间相关联…

04 tp6 的查数据 find、select、findOrEmpty、findOrFail、toArray、selectOrFail、value、column《ThinkPHP6 入门到电商实战》

文章目录&#xff08;更新中…&#xff09; 01 thinkphp6的前期开发准备《ThinkPHP6 入门到电商实战》 02 控制器《ThinkPHP6 入门到电商实战》 03 数据库查询、模型查询、多库查询《ThinkPHP6 入门到电商实战》 04 tp6 的查数据《ThinkPHP6 入门到电商实战》 05 tp6 的数据添…

学生信息管理系统小结

ASP.NETAccess 一、登入部分 主界面 Fm new 主界面(); string s1 "ProviderMicrosoft.Jet.OLEDB.4.0;Data Sourcestudent.mdb"; string s2 "select*from 登录信息表 where 用户名" this.ttbName.Text " and 密码 "…

05 tp6 的数据添加 助手函数、 save、insert、strict、replace、insertGetId、insertAll《ThinkPHP6 入门到电商实战》

文章目录&#xff08;更新中…&#xff09; 01 thinkphp6的前期开发准备《ThinkPHP6 入门到电商实战》 02 控制器《ThinkPHP6 入门到电商实战》 03 数据库查询、模型查询、多库查询《ThinkPHP6 入门到电商实战》 04 tp6 的查数据《ThinkPHP6 入门到电商实战》 05 tp6 的数据添…

VS2019如何创建C++项目?没有找到空项目(C++)完全解决方案

在使用Visual Studio 2019创建C++空项目时,没有空白项目可选,如下图所示,原因是在安装VS2019时没有选择C++对应的模块。本文讲解如何使用VS2019创建C++空项目,并使用C语言输出Hello World。 运行Visual Studio Installer,点击【修改】。 勾选【使用C++的桌面开发】,点击…

CentOS7.2 忘记root密码解决

CentOS 7 root密码的重置方式和CentOS 6完全不一样&#xff0c;以进入单用户模式修改root密码为例。 1.重启开机按esc&#xff0c;在第一行按e&#xff0c;进行编辑 2.编辑修改两处&#xff1a;ro改为rw,在LANGen_US.UFT-8后面添加init/bin/sh 3.按CtrlX重启&#xff0c;并修改…

android:制作 Nine-Patch 图片

它是一种被特殊处理过的 png 图片&#xff0c;能够指定哪些区域可以被拉伸而 哪些区域不可以。 那么 Nine-Patch 图片到底有什么实际作用呢&#xff1f;我们还是通过一个例子来看一下吧。比如 说项目中有一张气泡样式的图片 message_left.png&#xff0c;如图 3.38 所示。 图 …

08 获取器 withAttr、多连缀、whereRaw、事务、数据集《ThinkPHP6 入门到电商实战》

知识点&#xff1a;获取器 withAttr、多连缀、whereRaw、事务、数据集 文章目录&#xff08;更新中…&#xff09; 01 thinkphp6的前期开发准备《ThinkPHP6 入门到电商实战》 02 控制器《ThinkPHP6 入门到电商实战》 03 数据库查询、模型查询、多库查询《ThinkPHP6 入门到电商…