• 【从头构筑C#知识体系】1.9 特性


    【系列文章目录】



    前言

    本篇介绍特性

    【C#文档——特性】

    一、什么是特性

    1.文档中的介绍

    文档中的介绍:

    使用特性,可以有效地将元数据或声明性信息与代码(程序集、类型、方法、属性等)相关联。
    将特性与程序实体相关联后,可以在运行时使用反射这项技术查询特性。

    有点看不懂,我们可以结合一下代码来理解

    2.结合例子理解

    在Unity中我们十分常用的一个特性就是SerializeField

    [SerializeField]
    private int i;
    
    • 1
    • 2

    SerializeField可以让私有的成员变量在 Inspector 上进行显示。

    所以特性就是我们常说的标签

    在运行时,我们可以通过这些标签对标记的对象做一些特殊的操作。
    (比如Untiy中SerializeField就是序列化对象,关联这个标签的对象将会被序列化)

    二、自定义特性

    特性的使用很简单,就是在需要关联特性的对象前加上标签

    那么我们该如何自定义一个特性呢?

    public class SetHellowAttribute : Attribute 
    {    
    	string name;
    	public SetHellowAttribute (string name)  
        {  
            this.name = name;   
        }  
         public string GetName()  
        {  
            return name;  
        }  
    }  
    
    public class Test
    {   
        [SetHellow("Attribute")]   
        public string Text; 
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    这样我们就定义好了一个特性,但是
    特性本身其实就是一个标签,这样只是为Text变量关联了一个标签
    如果需要让它有实际作用,还需要用到反射的技术

    //·通过特性获取对象
    // 创建 Test 对象  
    var test= new Test();      
    // 获取 Test 的类型 
    var type = test.GetType(); 
    // 获取所有标记 SetHellow 的成员变量 
    // 获取所有成员变量 
    var members = type.GetMembers();      
    var markedMembers =       
            members.Where(m => m.GetCustomAttributes(typeof(SetHellowAttribute), false).Length != 0);      
    // 设置 Hello
    foreach (var markedMember in markedMembers)    
    {       
    	var fieldInfo = markedMember as FieldInfo;
    	fieldInfo.SetValue(test, "Hello");
    }
    // 输出    
    Debug.Log(test.Text);
    
    //·特性提供额外的信息与功能
    //获取所有SetHellowAttribute特性
    var attrs = System.Attribute.GetCustomAttributes(typeof(SetHellowAttribute));
    //使用特性方法
    foreach (System.Attribute attr in attrs)
    {
        if (attr is SetHellowAttribute)
        {
            SetHellowAttribute a = (SetHellowAttribute)attr;
            //输出额外信息
            Debug.Log(a.name);
            //执行额外方法
            a.LogWorld();
        }
    }
    
    //output:
    //Hello 
    //Attribute
    //World
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    三、总结


  • 相关阅读:
    2022年12月1日最新的SqlServer安装教程
    昇思25天学习打卡营第13天 | ResNet50迁移学习
    【深入浅出Spring6】第二期——依赖注入
    IDEA 全局查找 ctrl + shift + F 快捷键失效
    mysql(1)
    【无标题】
    Arduino驱动MAX31865读取铂电阻温度
    RabbitMQ 消息队列中间件详解
    基于ssm的图书(借阅)管理系统
    IO模型介绍(select、poll、epoll)
  • 原文地址:https://blog.csdn.net/ruanlinxi1994/article/details/125495670