.NET简谈特性(代码属性)

由于很久没有写关于基础知识的东西了,今天来总结一下关于.NET平台中的代码属性的概念;只是基础介绍,文章的本意是带领初学者学会使用特性,而不是讨论高深的底层技术;[王清培版权所有,转载请给出署名]

1.什么叫特性Attribute

特性对一般.NET编程人员来说并不陌生,自从我们开始接触C#语言的时候,我们多多少少已经接触了关于特性的使用;但是对于初学者来说真的不明白特性的意义,特性到底是属于类还是类实例,这些概念搞不清楚对理解代码的逻辑真的很顺利;这篇文章我将带您来了解特性的作用,其实特性的真的很方便;至少我认为自从我懂特性之后,我的代码便的更加的人性化,程序的结构清晰易懂,所以本人在写代码的时候经常喜欢用一些能够简单明了的表达对象的特点的风格;

其实特性Attribute就是一段代码属性,附加在我们定义的对象上的,特性属于对象而不是实例,这个概念要注意;为什么需要特性,我想任何一个开发人员都不需要问为什么,因为它的好处我们是拍手叫绝的,好东西为什么不要呢;之所以你没感觉到是因为朋友你还没发现他的优点;我们还是拿代码例子来讲吧,这样便于我们双向交流;

2.实例代码学习

using System;
using System.Collections.Generic;
using System.Text;
 
namespace AttributeTest
{
    [TableName(Name = "Tb_UserName")]
    public class M_UserName
    {
 
    }
}

这段代码里,我有一个M_UserName类,在类的上面我加了一个TableName的特性,这个特性是用来标识我这个类对应着数据库表的名称,这样的应用一般都会在ORM中出现;TableName是我们自己定义的一个特性,这样的特性不能影响系统的编译行为,而系统的特性会改变代码的编译行为,这样的编译控制是有必要的,比如我们在进行.NET安全编程的时候,经常会用到SecurityPermissionAttribute特性控制代码的安全执行逻辑,操作系统的API最重要的一个作用就是权限控制,以免大家一起进入内核;如果不用特性进行标记,那么所有的方法都会被统一编译无法控制;[王清培版权所有,转载请给出署名]

我们回到TableName特性,特性是一中特殊的类型,这个类型继承自Attribute对象;

using System;
using System.Collections.Generic;
using System.Text;
 
namespace AttributeTest
{
    /// <summary>
    /// 数据库表的名称
    /// </summary>
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
    public class TableName : Attribute
    {
        /// <summary>
        /// 名称
        /// </summary>
        public string Name { getset; }
    }
}

我们定义的特性还需要用系统的AttributeUsage特性进行标记,系统好将我们自己定义的特性当成特殊的类型处理;在此穿插一句,特性也是属于类类型,只不过是一种特殊的类型,这中类型是需要我们用系统特性进行说明的,这样系统在编译的时候才会将我们的特性进行元数据的区分,我们通过反射就可以把这个特殊的元数据拿到;

也许你会问,我这样标记了一个类的特性有什么用呢,当然有用,我们下面通过反射来进行动态读取对象的特性;特性属于类类型也就是属于Type,我们是通过类型获取而不是实例获取特性;

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
 
namespace AttributeTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Type type = typeof(M_UserName);//通过typeof方法获取Type对象
 
            object[] obj = type.GetCustomAttributes(typeof(TableName), false);//通过Type对象获取指定特性
 
            TableName name = obj[0] as TableName;
 
            Console.WriteLine(name.Name);
 
            Console.ReadLine();
        }
    }
}

这样我们就拿到了特性所标记的值,其实你可以把特性当成是一种静态类,当我们获取特性的时候,系统会将特性类进行加载到内存中,我不知道特性类的数据在内存中的布局是什么样的,但是对我们刚开始学习使用的时候,可以这么先理解;

总结:特性是一段代码属性,是一种特殊的类,在编译的时候以特殊的身份存在于元数据中,当我们获取它的时候,系统加载到内存中。特性属于类,不属于类实例;[王清培版权所有,转载请给出署名]

原文地址:https://www.cnblogs.com/Leo_wl/p/2100509.html