.Net特性Attribute的高级使用

简介: 【10月更文挑战第14天】在.NET中,特性(Attribute)是一种强大的机制,用于在代码中添加元数据。本文介绍了特性的高级用法,包括自定义特性、通过反射读取特性、条件编译与特性结合、多个特性应用以及特性继承。通过示例展示了如何创建自定义特性类、应用自定义特性,并通过反射获取特性信息。此外,还介绍了如何利用条件编译符号实现不同版本的代码控制,以及如何在一个代码元素上应用多个特性。最后,探讨了如何通过`AttributeUsage`控制特性的继承行为。

在.NET 中,特性(Attribute)是一种强大的机制,用于在代码中添加元数据。以下是 Attribute 的一些高级使用:


1. 自定义特性


  • 创建自定义特性类:通过继承System.Attribute类来创建自定义特性。例如,创建一个用于标记方法是否已过时的自定义特性。


[AttributeUsage(AttributeTargets.Method)]
public class ObsoleteMethodAttribute : Attribute
{
    public string Message { get; set; }
    public ObsoleteMethodAttribute(string message)
    {
        Message = message;
    }
}


  • 在上述代码中,AttributeUsage特性用于指定自定义特性ObsoleteMethodAttribute可以应用于方法(AttributeTargets.Method)。这个自定义特性有一个属性Message,用于存储方法已过时的相关信息。
  • 应用自定义特性


class MyClass
{
    [ObsoleteMethod("This method is obsolete. Use NewMethod instead.")]
    public void OldMethod()
    {
    }
    public void NewMethod()
    {
    }
}


  • 这里在MyClassOldMethod方法上应用了ObsoleteMethodAttribute特性,传递了一个表示过时信息的字符串。


2. 通过反射读取特性


  • 获取类型中的特性信息:可以使用反射来检查类型是否应用了特定的特性,并读取特性中的信息。


class Program
{
    static void Main()
    {
        Type myClassType = typeof(MyClass);
        MethodInfo oldMethodInfo = myClassType.GetMethod("OldMethod");
        if (oldMethodInfo.IsDefined(typeof(ObsoleteMethodAttribute), false))
        {
            ObsoleteMethodAttribute obsoleteAttr = (ObsoleteMethodAttribute)oldMethodInfo.GetCustomAttribute(typeof(ObsoleteMethodAttribute));
            Console.WriteLine(obsoleteAttr.Message);
        }
    }
}


  • 首先,通过typeof操作符获取MyClass的类型信息,然后使用GetMethod获取OldMethodMethodInfo。接着,通过IsDefined检查方法是否应用了ObsoleteMethodAttribute,如果是,则使用GetCustomAttribute获取特性实例并读取其中的Message属性。


3. 条件编译与特性结合


  • 在.NET 中,可以使用条件编译符号结合特性来实现更灵活的代码控制。例如,在调试版本和发布版本中对代码进行不同的处理。


[Conditional("DEBUG")]
public static void DebugOnlyMethod()
{
    Console.WriteLine("This method only executes in debug builds.");
}


  • 当编译时定义了DEBUG符号(通常在调试配置下),DebugOnlyMethod方法会被包含在编译后的代码中;如果没有定义DEBUG符号(如在发布配置下),对DebugOnlyMethod的调用会被编译器忽略。


4. 多个特性应用


  • 一个代码元素(如类、方法、属性等)可以应用多个特性。


[Serializable]
[Obsolete("This class is obsolete. Use AnotherClass instead.")]
class MyOldClass
{
}


  • 这里MyOldClass同时应用了Serializable特性(表示该类可以被序列化)和Obsolete特性(表示该类已过时)。


5. 特性继承


  • 控制特性继承行为:在定义自定义特性时,可以通过AttributeUsageInherited参数来控制特性是否可以被继承。


[AttributeUsage(AttributeTargets.Class, Inherited = false)]
public class NonInheritedAttribute : Attribute
{
}


  • 对于上述NonInheritedAttribute,如果一个类应用了该特性,它的子类不会自动继承这个特性。如果Inherited设置为true(默认值为true,除了少数如AttributeUsage本身等特性),子类会继承父类的特性。
相关文章
|
3月前
|
人工智能 开发框架 .NET
.NET技术的强大功能:.NET技术的基础特性、在现代开发中的应用、以及它如何助力未来的软件开发。
.NET技术是软件开发领域的核心支柱,以其强大功能、灵活性及安全性广受认可。本文分三部分解析:基础特性如多语言支持、统一运行时环境;现代应用如企业级与Web开发、移动应用、云服务及游戏开发;以及未来趋势如性能优化、容器化、AI集成等,展望.NET在不断变化的技术环境中持续发展与创新。
117 4
|
28天前
|
JSON C# 开发者
C#语言新特性深度剖析:提升你的.NET开发效率
【10月更文挑战第15天】C#语言凭借其强大的功能和易用性深受开发者喜爱。随着.NET平台的演进,C#不断引入新特性,如C# 7.0的模式匹配和C# 8.0的异步流,显著提升了开发效率和代码可维护性。本文将深入探讨这些新特性,助力开发者在.NET开发中更高效地利用它们。
33 1
|
3月前
|
数据采集 API 开发者
.NET 8新特性:使用ConfigurePrimaryHttpMessageHandler定制HTTP请求
在.NET 8中,通过`ConfigurePrimaryHttpMessageHandler`方法,开发者能更精细地控制HTTP请求,这对于构建高效爬虫尤为重要。此特性支持定制代理IP、管理Cookie与User-Agent,结合多线程技术,有效应对网络限制及提高数据采集效率。示例代码展示了如何设置代理服务器、模拟用户行为及并发请求,从而在遵守网站规则的同时,实现快速稳定的数据抓取。
.NET 8新特性:使用ConfigurePrimaryHttpMessageHandler定制HTTP请求
|
3月前
|
JSON API C#
闲话 .NET(6):.NET Core 各个版本的特性
闲话 .NET(6):.NET Core 各个版本的特性
|
4月前
|
人工智能 开发框架 Devops
.NET技术概览:** 本文探讨了.NET的核心特性,包括多语言支持、Common Language Runtime、丰富的类库和跨平台能力,强调其在企业级、Web、移动及游戏开发中的应用。
【7月更文挑战第4天】.NET技术概览:** 本文探讨了.NET的核心特性,包括多语言支持、Common Language Runtime、丰富的类库和跨平台能力,强调其在企业级、Web、移动及游戏开发中的应用。此外,讨论了.NET如何通过性能优化、DevOps集成、AI与ML支持以及开源策略应对未来挑战,为开发者提供强大工具,共创软件开发新篇章。
53 3
|
5月前
|
存储 编译器
【.NET Core】特性(Attribute)详解
【.NET Core】特性(Attribute)详解
309 2
|
5月前
|
前端开发 C#
【.NET Core】你认识Attribute之CallerMemberName、CallerFilePath、CallerLineNumber三兄弟
【.NET Core】你认识Attribute之CallerMemberName、CallerFilePath、CallerLineNumber三兄弟
86 0
|
6月前
|
机器学习/深度学习 存储 开发工具
【专栏】解读 .NET 技术的先进特性
【4月更文挑战第29天】.NET 技术推动各行业软件开发创新,提供高效开发环境(如Visual Studio)和跨平台能力(.NET Core),支持多语言和函数式编程。其生态系统繁荣,NuGet包含大量开源库。同时,.NET整合云服务(Azure)和机器学习(ML.NET),强化应用扩展性和智能处理,巩固其在现代开发中的关键角色。
40 0
|
6月前
|
开发框架 .NET Java
ASP.NET Core高级编程--C#基本特性(一)
本文章简略介绍C#的部分特性
|
开发框架 前端开发 .NET
ASP.NET Core 核心特性学习笔记「下」
ASP.NET Core 核心特性学习笔记「下」

热门文章

最新文章