1. 擴展方法 擴展方法使你能夠向現有類型“添加”方法,而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。 擴展方法是一種靜態方法,但可以像擴展類型上的實例方法一樣進行調用。 對於用 C#、F# 和 Visual Basic 編寫的客戶端代碼,調用擴展方法與調用在類型中定義的方法沒有明顯區別 ...
擴展方法使你能夠向現有類型“添加”方法,而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。 擴展方法是一種靜態方法,但可以像擴展類型上的實例方法一樣進行調用。 對於用 C#、F# 和 Visual Basic 編寫的客戶端代碼,調用擴展方法與調用在類型中定義的方法沒有明顯區別。
最常見的擴展方法是 LINQ 標準查詢運算符,它將查詢功能添加到現有的
OrderBy 示例
下麵的示例演示如何對一個整數數組調用標準查詢運算符 OrderBy
方法。 括弧裡面的表達式是一個 lambda 表達式。 很多標準查詢運算符採用 Lambda 表達式作為參數,但這不是擴展方法的必要條件。 有關詳細信息,請參閱
class ExtensionMethods2 { static void Main() { int[] ints = { 10, 45, 15, 39, 21, 26 }; var result = ints.OrderBy(g => g); foreach (var i in result) { System.Console.Write(i + " "); } } } //Output: 10 15 21 26 39 45
擴展方法被定義為靜態方法,但它們是通過實例方法語法進行調用的。 它們的第一個參數指定方法操作的類型。 參數前面是
自定義擴展方法
-
創建一個靜態類
-
創建一個靜態方法,這個方法即是你的擴展方法
-
方法中必須將你要擴展的類型通過參數傳遞進來
-
在你需要擴展的參數類型前面加this
namespace Utils; // 你的命名空間 // 擴展方法的工具類,註意一定要寫成static 靜態類 public static class ExtendUtils { /** * 1. 靜態類下所有的方法都只能是static 方法 * 2. 把你需要擴展的類型前面加this */ public static int ParseInt(this string str) { if (string.IsNullOrWhiteSpace(str)) { return 0; } int result = 0; if (!int.TryParse(str, out result)) { return 0; } return result; }
使用
-
在你使用擴展方法之前,必須將擴展方法所在命名空間引用進來
using System; using NUnit.Framework; using Utils; // 若要使用擴展方法,必須先將其所在命名空間引用進來 namespace TestProject1; public class Tests { [SetUp] public void Setup() { } [Test] public void Test1() { string strNumber = "30"; Console.WriteLine(strNumber.ParseInt()); // 使用擴展方法 } }
2. 特性
使用特性,可以有效地將元數據或聲明性信息與代碼(程式集、類型、方法、屬性等)相關聯。 將特性與程式實體相關聯後,可以在運行時使用反射這項技術查詢特性,常運用於AOP技術。
特性具有以下屬性:
-
特性向程式添加元數據。 元數據是程式中定義的類型的相關信息。 所有 .NET 程式集都包含一組指定的元數據,用於描述程式集中定義的類型和類型成員。 可以添加自定義特性來指定所需的其他任何信息。 有關詳細信息,請參閱
-
可以將一個或多個特性應用於整個程式集、模塊或較小的程式元素(如類和屬性)。
-
特性可以像方法和屬性一樣接受自變數。
-
程式可使用反射來檢查自己的元數據或其他程式中的元數據。 有關詳細信息,請參閱
創建自定義特性
可通過定義特性類創建自己的自定義特性,特性類是直接或間接派生自
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct) ] public class AuthorAttribute : System.Attribute { private string name; public double version; public AuthorAttribute(string name) { this.name = name; version = 1.0; } }
類名 AuthorAttribute
是該特性的名稱,即 Author
加上 Attribute
尾碼。 由於該類派生自 System.Attribute
,因此它是一個自定義特性類。 構造函數的參數是自定義特性的位置參數。 在此示例中,name
是位置參數。 所有公共讀寫欄位或屬性都是命名參數。 在本例中,version
是唯一的命名參數。 請註意,使用 AttributeUsage
特性可使 Author
特性僅對類和 struct
聲明有效。
可按如下方式使用這一新特性:
[Author("P. Ackerman", version = 1.1)] class SampleClass { // P. Ackerman's code goes here... } AttributeUsage 有一個命名參數 AllowMultiple,通過此命名參數可一次或多次使用自定義特性。 下麵的代碼示例創建了一個多用特性。 [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct, AllowMultiple = true) // multiuse attribute ] public class AuthorAttribute : System.Attribute
在下麵的代碼示例中,某個類應用了同一類型的多個特性。
[Author("P. Ackerman", version = 1.1)] [Author("R. Koch", version = 1.2)] class SampleClass { // P. Ackerman's code goes here... // R. Koch's code goes here... }
3. JSON 操作
JSON: JavaScript Object Notation(JavaScript 對象表示法)
JSON 是存儲和交換文本信息的語法,類似 XML。
JSON 比 XML 更小、更快,更易解析。
1. 什麼是Json
-
SON 指的是 JavaScript 對象表示法(JavaScript Object Notation)
-
JSON 是輕量級的文本數據交換格式
-
JSON 獨立於語言:JSON 使用 Javascript語法來描述數據對象,但是 JSON 仍然獨立於語言和平臺。JSON 解析器和 JSON 庫支持許多不同的編程語言。 目前非常多的動態(PHP,JSP,.NET)編程語言都支持JSON。
-
JSON 具有自我描述性,更易理解
{ "sites": [ {id:1, "name":"C#教程" , "url":"www.runoob.com" }, {id:2, "name":"google" , "url":"www.google.com" }, {id:3, "name":"微博" , "url":"www.weibo.com" } ] }
大家平時在自己寫JSON時,可以藉助於
{ "sites": [ { "name": "菜鳥教程", "url": "www.runoob.com" }, { "name": "google", "url": "www.google.com" }, { "name": "微博", "url": "www.weibo.com" } ] }
JSON 語法規則
-
數據在鍵值對中
-
數據由逗號分隔
-
花括弧保存對象
-
方括弧保存數組
JSON 名稱/值對
JSON 數據的書寫格式是:名稱/值對。
名稱/值對組合中的名稱寫在前面(在雙引號中),值對寫在後面(同樣在雙引號中),中間
用冒號隔開:"firstName":"John"
JSON 值可以是:
數字(整數或浮點數)
字元串(在雙引號中)
邏輯值(
true 或 false)
數組(在方括弧中)
對象(在花括弧中)
null
JSON數據結構
json簡單說就是javascript中的對象和數組,所以這兩種結構就是對象和數組兩種結構,通
過這兩種結構可以表示各種複雜的結構
1、對象:對象在js中表示為“{}”括起來的內容,數據結構為 {key:value,key:
value,...}的鍵值對的結構,在面向對象的語言中,key為對象的屬性,value為對應的屬性
值,所以很容易理解,取值方法為 對象.key (
c# 對象[key])獲取屬性值,這個屬性值的
類型可以是 數字、字元串、數組、對象幾種。
2、數組:數組在js中是中括弧“[]”括起來的內容,數據結構為
["java","javascript","vb",...],取值方式和所有語言中一樣,使用索引獲取,欄位值的
類型可以是 數字、字元串、數組、對象幾種。
經過對象、數組2種結構就可以組合成複雜的數據結構了。
.Net 中提供的JSON解析組件
-
Newtonsoft.Json
-
fastjson
2. 序列化與反序列化
使用nuget 工具 將 Newtonsoft.Json
引用到當前項目中
序列化
對象轉換為Json
using Newtonsoft.Json; public class Site { public int Id { get; set; } public string Name { get; set; } public string Url { get; set; } } // 對象轉換為Json [Test] public void ObjectToJson() { Site site = new() { Id = 1, Name = "任我行網路教育有限公司", Url = "www.renwoxing.com" }; string json = JsonConvert.SerializeObject(site); Console.WriteLine(json); } // 輸出結果 {"Id":1,"Name":"任我行網路教育有限公司","Url":"www.renwoxing.com"}
集合序列化
[Test] public void ListToJson() { List<Site> sites = new List<Site>(); sites.Add(new() { Id = 1, Name = "任我行網路教育有限公司", Url = "www.renwoxing.com" }); sites.Add(new() { Id = 2, Name = "百度", Url = "www.baidu.com" }); string json = JsonConvert.SerializeObject(sites); Console.WriteLine(json); }
輸出結果:
[{ "Id": 1, "Name": "任我行網路教育有限公司", "Url": "www.renwoxing.com" }, { "Id": 2, "Name": "百度", "Url": "www.baidu.com" }]
反序列化
json轉對象
[Test] public void JsonToObject() { string json = "{\"Id\":1,\"Name\":\"任我行網路教育有限公司\",\"Url\":\"www.renwoxing.com\"}"; Site site = JsonConvert.DeserializeObject<Site>(json); }
json轉集合
[Test] public void JsonToList() { string json = "[{\"Id\": 1,\"Name\": \"任我行網路教育有限公司\",\"Url\": \"www.renwoxing.com\"},
{\"Id\": 2,\"Name\": \"百度\",\"Url\": \"www.baidu.com\"}]"; List<Site> sites = JsonConvert.DeserializeObject<List<Site>>(json); Console.WriteLine(sites.Count); }
4. 綜合訓練
結合反射,枚舉,特性,擴展方法,完成綜合練習。
-
聲明枚舉如下:
using System.ComponentModel; /** * 訂單狀態 */ public enum OrderStateEnum { [Description("待支付")] WaitPay, [Description("待發貨")] WaitSend, [Description("待收貨")] WaitReceive, [Description("待評論")] WaitComment, [Description("已完成")] Finish, [Description("取消訂單")] Cancel }
-
要求 封裝OrderStateEnum的擴展 方法 GetDescription() ,效果如下
string desc = OrderStateEnum.WaitPay.GetDescription(); Console.WriteLine(desc); // 輸出:待支付
3. 具體實現
/// <summary> /// 獲取描述特性信息 /// </summary> /// <param name="stateEnum"></param> /// <returns></returns> public static string GetDescription(this OrderStateEnum stateEnum) { var type = stateEnum.GetType(); var fieldInfo = type.GetField(stateEnum.ToString()); var desc = fieldInfo.GetCustomAttribute<DescriptionAttribute>(); return desc.Description; }
配套視頻鏈接:
C# 高級編程,.Net6 系列 開發第三階段,學完拿捏你的面試官,.net6 進階學習(已完結)_嗶哩嗶哩_bilibili
海闊平魚躍,天高任我行,給我一片藍天,讓我自由翱翔。