上篇文章講述了C#反射知識點,本文將介紹C#特性(Attribute)的知識點。C#特性(Attribute)是一種強大的元數據機制,用於為代碼元素(如類、方法、屬性等)添加信息,以影響它們的行為或提供額外的信息。本文將介紹C#特性每個.NET開發都應熟悉的知識點,希望對大家開發有一定的幫助。 1、 ...
上篇文章講述了C#反射知識點,本文將介紹C#特性(Attribute)的知識點。C#特性(Attribute)是一種強大的元數據機制,用於為代碼元素(如類、方法、屬性等)添加信息,以影響它們的行為或提供額外的信息。本文將介紹C#特性每個.NET開發都應熟悉的知識點,希望對大家開發有一定的幫助。
1、特性的基本概念
公共語言運行時使你能夠添加類似於關鍵字的描述性聲明(稱為特性),以便批註編程元素(如類型、欄位、方法和屬性),它是以方括弧([])的形式附加到代碼元素上,並可包含參數。特性的定義通常是通過創建一個繼承自System.Attribute的自定義類來實現的。下麵是一個簡單的特性定義示例,是.NET預設創建最小api的官方示例:
[HttpGet(Name = "GetWeatherForecast")]//特性
public IEnumerable<WeatherForecast> Get()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
以上特性是http的Get請求特性,對外的鏈接名稱是GetWeatherForecast。
詳解-->C#-特性(Attribute)
2、內置特性的示例
C#預設提供了一些內置特性,例如[Obsolete]、[Serializable]和[Conditional]等。這樣以便.NET開發很方便處理基本特定的邏輯任務。
[Obsolete] 特性:[Obsolete]特性用於標記已過時的代碼。它可以接受一個可選的消息參數,用於提供有關為何該代碼已過時的信息。
[Serializable] 特性:[Serializable]特性用於標記一個類可以序列化,以便將對象轉換為位元組流。例如:
[Serializable]
public class SerializableClass
{
// 類的成員
}
3、自定義特性
當然大家也可以自定義特性,以滿足項目的特定需求。通常自定義特征需要繼承Attribute類,併在類上面加AttributeUsage特性,然後在這下麵處理需要的邏輯,具體看之前我的一篇自定義特性的文章.NET特性(Attribute)簡單自定義。下麵是自定義了一個顯示作者等信息的特性。
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public class AuthorInfoAttribute : Attribute
{
public string Author { get; }
public string Version { get; }
public AuthorInfoAttribute(string author, string version)
{
Author = author;
Version = version;
}
}
//使用特性
[AuthorInfo("DotNet開發跳槽", "1.0")]
public class MyAwesomeClass
{
// 類的成員
}
4、特性的應用場景
那麼特性通常用在什麼地方呢?
特性在.NET生態系統中有多種應用場景,比如代碼文檔的生成;代碼分析和驗證,比如屬性的Name欄位長度驗證等;可以依賴註入;最最重要的是可以實現AOP(面向切麵編程),比如可以用於日誌記錄和性能監控等。
5、 特性的運行時和編譯時用法
特性在C#中既具有運行時用途,通過反射機制可以在程式運行時動態檢查和操作已應用特性的代碼元素,又具有編譯時用途,可在編譯時影響編譯器的行為,例如條件編譯、代碼生成和靜態分析,從而為開發者提供了在代碼的不同階段(編譯和運行時)對代碼進行元數據標記和定製的靈活性和功能。
6、特性的屬性訪問
通過反射,您可以訪問已應用於代碼元素的特性及其參數。在上篇介紹反射(C#反射知識點)的文章已經有所介紹。下麵演示如何檢查並獲取類上的自定義特性信息。
Type type = typeof(MyAwesomeClass);
var attributes = type.GetCustomAttributes(typeof(AuthorInfoAttribute), false);
if (attributes.Length > 0 && attributes[0] is AuthorInfoAttribute authorInfo)
{
Console.WriteLine($"作者: {authorInfo.Author}, 版本號: {authorInfo.Version}");
}
//上面的代碼將列印MyAwesomeClass類的特性,展示出特性屬性的作者和版本號。
結語
本文講述了C#特性的一些知識點,比如自定義特性、內置特性、獲取特性內容等,這些知識點都是.NET開發應該掌握的。
希望本文提供的C#特性知識對每個.NET開發者都有所幫助,對於C#特性的知識點,你還知道哪些?歡迎留言討論或者吐槽本文。
參考:
1、微軟官網:
learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/language-specification/attributes
2、AI查詢
**推薦閱讀
2、.NET無處不在的特性(Attribute)2-簡單自定義
來源公眾號:DotNet開發跳槽