最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c# 獲取特性的接口的實現(xiàn)

 更新時間:2026年05月08日 10:10:59   作者:科學(xué)的發(fā)展-只不過是讀大自然寫的代碼  
本文主要介紹了c# 獲取特性的接口的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在 C# 中,并沒有一個專門的“獲取特性的接口”(即沒有類似 IGetAttribute 這樣的接口供你實現(xiàn)或調(diào)用)。

獲取特性(Attributes)是通過 反射(Reflection) 機制完成的,主要依賴以下兩個核心類/方法:

  1. System.Attribute 類:提供了靜態(tài)方法來獲取特性。
  2. System.Reflection 命名空間下的類型:如 Type, MethodInfo, PropertyInfo 等,它們提供了實例方法 GetCustomAttributes。

以下是獲取特性的三種主要方式:

1. 使用Attribute.GetCustomAttribute(推薦用于獲取單個)

這是最傳統(tǒng)且語義清晰的方法,適用于當(dāng)你確定只需要獲取一個特定類型的特性時。

  • 位置:System 命名空間
  • 特點:如果找到返回該特性實例,找不到返回 null。如果同一元素上有多個同類特性且 AllowMultiple=true,它只返回第一個。
using System;
using System.Reflection;
// 假設(shè) MyClass 上有一個 [MyAttribute]
Type type = typeof(MyClass);
// 獲取單個特性
var attr = (MyAttribute)Attribute.GetCustomAttribute(type, typeof(MyAttribute));
if (attr != null)
{
    Console.WriteLine(attr.Description);
}

泛型版本 (.NET Core / .NET 5+ 更常用):

// 語法更簡潔,無需強制轉(zhuǎn)換
var attr = Attribute.GetCustomAttribute<MyAttribute>(type);

2. 使用MemberInfo.GetCustomAttributes(推薦用于獲取多個)

這是 Type, MethodInfo, PropertyInfo 等反射對象的實例方法。適用于需要獲取所有特性,或者不確定是否有多個同名特性的情況。

  • 位置:System.Reflection 命名空間
  • 特點:返回一個數(shù)組 (object[]T[])。
using System;
using System.Reflection;
using System.Linq;
Type type = typeof(MyClass);
// 獲取該類型上所有的 MyAttribute 實例
var attrs = type.GetCustomAttributes<MyAttribute>(inherit: true).ToArray();
foreach (var attr in attrs)
{
    Console.WriteLine(attr.Description);
}
// 如果不指定泛型,返回 object[]
var allAttrs = type.GetCustomAttributes(inherit: true); 

3. 使用ICustomAttributeProvider接口 (底層機制)

雖然你通常不直接使用它,但值得了解的是,所有可以應(yīng)用特性的元素(如 Type, Assembly, MethodInfo)都實現(xiàn)了 System.Reflection.ICustomAttributeProvider 接口。

這個接口定義了兩個核心方法,上述的 GetCustomAttributes 方法本質(zhì)上就是調(diào)用這里:

  • object[] GetCustomAttributes(bool inherit)
  • object[] GetCustomAttributes(Type attributeType, bool inherit)

示例(通常不需要這樣寫,除非你在做非常底層的反射框架):

// Type 類實現(xiàn)了 ICustomAttributeProvider
ICustomAttributeProvider provider = typeof(MyClass); 
var attrs = provider.GetCustomAttributes(typeof(MyAttribute), true);

關(guān)鍵參數(shù)說明:inherit

在調(diào)用 GetCustomAttributes 時,通常會看到一個 bool inherit 參數(shù):

  • true: 不僅檢查當(dāng)前元素,還會沿著繼承鏈向上查找基類或基接口上的特性(前提是特性定義時 [AttributeUsage(Inherited = true)])。
  • false: 只檢查當(dāng)前元素直接聲明的特性。

現(xiàn)代 C# 模式匹配寫法 (C# 7.0+)

在實際開發(fā)中,結(jié)合 is 模式匹配可以讓代碼更簡潔:

var method = typeof(MyClass).GetMethod("DoWork");
// 檢查并獲取
if (method.GetCustomAttribute<ObsoleteAttribute>() is ObsoleteAttribute obsAttr)
{
    Console.WriteLine($"該方法已過時: {obsAttr.Message}");
}
// 或者檢查是否存在任意特性
if (method.GetCustomAttributes<AuthorizationAttribute>().Any())
{
    // 執(zhí)行授權(quán)邏輯
}

總結(jié)

需求推薦方法返回類型
獲取單個特定特性Attribute.GetCustomAttribute<T>(member)T (找不到為 null)
獲取所有特定特性member.GetCustomAttributes<T>()IEnumerable<T>
獲取所有特性(不限類型)member.GetCustomAttributes()object[]
底層接口ICustomAttributeProviderobject[]

注意:為了性能考慮,.NET 6 及更高版本引入了 System.Reflection.CustomAttributeExtensions,上述泛型方法大多擴展自此類,性能優(yōu)于舊的非泛型方法。

到此這篇關(guān)于c# 獲取特性的接口的實現(xiàn)的文章就介紹到這了,更多相關(guān)c# 獲取特性接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#簡易圖片格式轉(zhuǎn)換器實現(xiàn)方法

    C#簡易圖片格式轉(zhuǎn)換器實現(xiàn)方法

    這篇文章主要介紹了C#簡易圖片格式轉(zhuǎn)換器實現(xiàn)方法,涉及C#基于WinForm操作圖片的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • C#實現(xiàn)異步發(fā)送郵件的方法

    C#實現(xiàn)異步發(fā)送郵件的方法

    這篇文章主要介紹了C#實現(xiàn)異步發(fā)送郵件的方法,涉及C#異步操作與郵件發(fā)送的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • C#實現(xiàn)在控制臺輸出當(dāng)前系統(tǒng)時間的方法

    C#實現(xiàn)在控制臺輸出當(dāng)前系統(tǒng)時間的方法

    這篇文章主要介紹了C#實現(xiàn)在控制臺輸出當(dāng)前系統(tǒng)時間的方法,涉及C#時間函數(shù)DateTime.Now的使用方法,需要的朋友可以參考下
    2015-04-04
  • Unity實現(xiàn)簡單搖桿的制作

    Unity實現(xiàn)簡單搖桿的制作

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)簡單搖桿的制作,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C# 前端無插件打印導(dǎo)出實現(xiàn)方式詳解

    C# 前端無插件打印導(dǎo)出實現(xiàn)方式詳解

    本文講述了使用C#實現(xiàn)前端無插件的打印和導(dǎo)出功能,介紹了相關(guān)技術(shù)和方法,適合需要在項目中實現(xiàn)相應(yīng)功能的開發(fā)者參考
    2024-10-10
  • CAD2008+VS2008開發(fā)ObjectARX加載失敗問題(推薦)

    CAD2008+VS2008開發(fā)ObjectARX加載失敗問題(推薦)

    這篇文章主要介紹了CAD2008+VS2008開發(fā)ObjectARX加載失敗問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • 解析C#中@符號的幾種使用方法詳解

    解析C#中@符號的幾種使用方法詳解

    本篇文章是對C#中@符號的幾種使用方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C#超實用代碼段合集

    C#超實用代碼段合集

    這篇文章主要介紹了C#超實用代碼段合集,涉及C#針對圖標(biāo)、數(shù)學(xué)運算、拼音、日期、時間及文件夾等的相關(guān)操作技巧,需要的朋友可以參考下
    2015-11-11
  • 解析如何正確使用SqlConnection的實現(xiàn)方法

    解析如何正確使用SqlConnection的實現(xiàn)方法

    本篇文章對如何正確使用SqlConnection的實現(xiàn)方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C# 中依賴注入(DI)的實現(xiàn)方式

    C# 中依賴注入(DI)的實現(xiàn)方式

    在C#中依賴注入(DI)的實現(xiàn)方式主要分為手動注入和通過IoC容器注入,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11

最新評論

正镶白旗| 冕宁县| 灌南县| 宝坻区| 渭源县| 林口县| 福海县| 廉江市| 浙江省| 平邑县| 和政县| 安泽县| 五台县| 台安县| 石楼县| 阿城市| 扎赉特旗| 如东县| 林口县| 淮北市| 蕉岭县| 沙湾县| 普安县| 博白县| 靖远县| 虎林市| 应用必备| 皮山县| 保定市| 天水市| 江门市| 新巴尔虎左旗| 根河市| 图木舒克市| 寻乌县| 乌兰浩特市| 延寿县| 同仁县| 新泰市| 西乡县| 改则县|