• .net----特性


    特性的概念和使用

    特性(Attribute)

    • 特性类:直接或间接派生于抽象类System.Attribute的类

    • 放置在其他声明上,即附加到各种程序实体(包括类型、方法、属性等),以添加元数据信息

    • 主要为编译器提供额外的信息,编译器可以通过这些附加特性,自动生成相应的代码,从而实现特定的功能

    • 程序代码也可以通过反射技术,在运行时环境中检索这些特性信息,以实现特定的操作

    特性形式

    公共语言运行库(CLR)中预定义的特性
    自定义特性

    特性类参数

    • 定位参数和命名参数列表

    • 将方括号中的特性名置于其适用的实体声明之前

    [DllImport(“user32.dll”, SetLastError=false, ExactSpelling=false)]
    [Conditional(“DEBUG”),Conditional(“TEST1”)]
    
    • 1
    • 2

    预定义通用特性类

    ConditionalAttribute类

    • Conditional特性通过测试条件编译符号来确定适用的条件

    • 采用一个或多个Conditional特性修饰

    • 条件特性类

    • 条件方法

    • 标记为条件方法的调用取决于是否定义了预处理符号

    public class MyTrace
    {
    [Conditional( "DEBUG" )]
    public static void Msg(string msg) { Console.WriteLine(msg); }
    
    [Conditional( "DEBUG" ), Conditional( "TRACE" )]
    public static void Method2()
    {
        Console.WriteLine("DEBUG or TRACE is defined");
    }
    }
    
    MyTrace.Msg("Now in Main..."); MyTrace.Method2();
    Console.WriteLine("Main Done."); 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    ObsoleteAttribute类

    • 将实体标记为一个建议不再使用的实体,在产品的未来版本中将被移除

    • 当调用使用Obsolete特性标记的实体时,编译器会生成警告

    • 两个定位参数:string类型的message和bool类型的error

    • 如果Obsolete特性的第2个参数为true时,则产生错误信息

    • 例12.2
      [System.Obsolete(“use NewMethod”, true )]

    AttributeUsageAttribute类

    • 应用于自定义特性类,以控制如何应用新特性

    • AttributeUsage特性修饰的类必须直接或间接从System.Attribute 派生

    • AttributeUsage特性可以设置3个参数:

    • ValidOn参数

    • AllowMultiple参数

    • Inherited参数

    全局特性

    调用方信息特性类
    用于跟踪和调试
    获取关于调用方的信息传递给方法,包括源代码路径、行号、方法或属性的名称
    在这里插入图片描述

    • 适用于整个程序集或模块
      全局特性在源代码中出现在顶级using指令之后,类型或命名空间声明之前

    • 【例12.4】基于Visual Studio的Windows 窗体应用程序模板的项目中,将自动创建一个名为 AssemblyInfo.cs 的文件,该文件包括若干全局特性

    自定义特性类

    • 通过直接或间接地从System.Attribute类派生创建

    • 特性类的声明遵循下列规则:

    • 派生类的类名一般采用XXXAttribute的命名规范,类名就是特性名

    • 构造函数的参数是自定义特性的定位参数

    • 任何公共读写字段或属性都是命名参数

    • 使用AttributeUsage特性指定特性类的限制条件

    [System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct,
    AllowMultiple = true) ] //允许单个实体应用多次该特性
    public class AuthorAttribute : System.Attribute
        {
            private string name; public double version;
    
            public AuthorAttribute(string name)
            {
                this.name = name; version = 1.0;
            }
        }
        [Author("Qingsong YU", version = 1.1)]
        [Author("Hong JIANG", version = 1.2)]
        class SampleClass
        {   //书写关于Qingsong YU的代码...
            //书写关于Hong JIANG的代码...
       }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    使用反射访问特性

    • C#使用反射技术来检索用自定义特性定义的信息

    • 首先,通过GetType方法或者typeof关键字来获取类型

    • 然后,通过GetCustomAttributes方法获取所应用的自定义特性的对象数组

    • 最后,通过自定义特性的对象数组进行相应的操作处理

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = true) 
    public class AuthorAttribute : Attribute{…….}
    ……
    [Author("Qingsong YU")]
    class FirstClass { }
    ……
    PrintAuthorInfo(typeof(FirstClass));
    ……
    
    private static void PrintAuthorInfo(System.Type t)
    {
    Attribute[] attrs = Attribute.GetCustomAttributes(t);//反射技术
    foreach (Attribute attr in attrs)
    {
        ……
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    sentinel熔断报java.lang.reflect.UndeclaredThrowableException
    闲话Python编程-字符串
    【摸鱼神器】UI库秒变LowCode工具——列表篇(一)设计与实现
    Qt-OpenCV学习笔记--基础知识和基本操作--总结
    1015:计算并联电阻的阻值
    物联网仪表ADW300接入ONENET平台介绍
    向日葵远程分辨率过低解决办法
    数据结构-红黑树
    mmcv的环境 真 TM 难配
    科软 信息安全 期末考试回忆
  • 原文地址:https://blog.csdn.net/weixin_51422230/article/details/128024501