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.pswp.cn/news/286024.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286024.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286024.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

highcharts動態獲取數據生成圖表問題

動態獲取數據說白點就是從后臺傳值到前臺&#xff0c;前臺把這些值賦值給x軸與y軸&#xff08;這里指的是你X軸與Y軸都是變化的數據&#xff0c;如果你的X軸是固定的&#xff0c;像時間等等的那就另說&#xff09;。 柱狀圖的動態傳值&#xff1a; //獲取后臺數據var x [];//…

【MATLAB統計分析與應用100例】案例020:matlab從相關系數矩陣出發進行主成分分析

文章目錄 1. 定義相關系數矩陣PHO2. 調用pcacov函數根據相關系數矩陣作主成分分析3. 為了更加直觀,以元胞數組形式顯示結果4. 以元胞數組形式顯示主成分表達式1. 定義相關系數矩陣PHO PHO = [1 0.79 0.36 0.76 0.25 0.510.79 1 0.31 0.55 0.17 …

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…

Java 數字相關操作通用類 NumberUtils.java

package com.*.*.*.utils;import java.math.BigDecimal; import java.math.BigInteger; import java.math.RoundingMode; import java.text.DecimalFormat; import java.util.regex.Matcher; import java.util.regex.Pattern;public class NumberUtils {/**可重復使用的Long常量…

Google登錄提示錯誤碼12501

1、問題 google第三方登錄,如果已經登錄過的賬號點擊可以登錄&#xff0c;但是添加新的谷歌賬號的時候提示&#xff0c;錯誤碼為12501&#xff0c;整個人都不好了。 2、解決辦法 AndroidManifest.xml里加上了如下信息 <meta-data android:name"com.google.android.g…

【微服務專題之】.Net6下集成微服務網關-Ocelot

微信公眾號&#xff1a;趣編程ACE關注可了解更多的.NET日常實戰開發技巧&#xff0c;如需源碼 請公眾號后臺留言 源碼;[如果覺得本公眾號對您有幫助&#xff0c;歡迎關注].Net6下集成微服務網關-Ocelot網關常見功能1&#xff1a;路由 routing2: 請求聚合3&#xff1a;身份驗證和…

Greenplum使用簡明手冊

GP服務啟停 su - gpadmin gpstart #正常啟動 gpstop #正常關閉 gpstop -M fast #快速關閉 gpstop –r #重啟 gpstop –u #重新加載配置文件 登陸與退出Greenplum #正常登陸 psql gpdb psql -d gpdb -h gphostm -p 5432 -U gpadmin #使用utility方式 PGOPTIONS"-c gp_sessi…

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 的數據添…

Android之BottomNavigationView實現底部按鈕水紋波效果

1、主要用法 <?xml version="1.0" encoding="utf-8"?> <layout ><data></data><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-…

ArcGIS Engine中空間參照(地理坐標)相關方法總結

轉自原文 ArcGIS Engine中空間參照(地理坐標)相關方法總結 1.創建空間參考/// <summary> /// 根據prj文件創建空間參考 /// </summary> /// <param name"strProFile">空間參照文件</param> /// <returns></returns> p…

聊聊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上集成了該功能。…

PHP實現各種經典算法

<? //-------------------- // 基本數據結構算法 //-------------------- //二分查找&#xff08;數組里查找某個元素&#xff09; function bin_sch($array, $low, $high, $k){ if ( $low < $high){ $mid intval(($low$high)/2 ); …

ArcGIS實驗教程——實驗二十八:統計圖表(餅狀圖、柱狀圖)制作

統計圖表(餅狀圖、柱狀圖)預覽: ArcGIS實驗視頻教程合集:《ArcGIS實驗教程從入門到精通》(附配套實驗數據)》 文章目錄 1. 制作圖表2. 在地圖上顯示圖表1. 制作圖表 加載甘肅行政區劃數據。 打開數據的屬性表,可以看到有面積、人口、GDP、土地利用等字段。

手把手教你做產品經理,視頻課教程已經發布,歡迎觀看

手把手教你做產品經理&#xff0c;視頻課教程已經發布&#xff0c;歡迎觀看http://edu.51cto.com/course/course_id-5062.html轉載于:https://blog.51cto.com/11101003/1732764

01 thinkphp6的前期開發準備《ThinkPHP6 入門到電商實戰》

本機環境&#xff1a;win10 集成環境&#xff1a;studyphp&#xff08;方便學習使用Windows下集成環境&#xff09; 數據庫可視化操作軟件&#xff1a;sqlyog 文章目錄&#xff08;更新中…&#xff09; 01 thinkphp6的前期開發準備《ThinkPHP6 入門到電商實戰》 02 控制器《…

Android之打開APP部分頁面(Activity)的一瞬間手機狀態欄會變成藍色解決辦法

一、問題 我們在打開app部分頁面的時候狀態欄是藍色的&#xff0c;一閃而過。 二、原因和解決辦法 我們在AndroidManifest.xml給application配置主題&#xff0c;然后主題是這一樣的 <style name"*****" parent"*****"><!-- Customize your th…

一個Dapr的POC應用

開源了之前開發的一個Dapr的POC應用。地址在&#xff1a;https://github.com/heavenwing/daprapps-poc是以一個供應鏈的系統&#xff08;的一部分業務&#xff09;作為場景。POC場景很簡單&#xff1a;管理部分基礎數據實現簡單的入庫流程&#xff0c;包括申請-收貨-入庫整個架…