C# Attribute特性


C#特性[Attribute]是一类特殊的语法结构,我们掌握了特性的相关用法,就能在运行时,通过反射,得到一些额外的属性,给后续程序逻辑进行使用和判断。
我们在日常的代码中,通常都是通过反射来获得相关特性对象,再赋值给相关对象,进行获取判断。
我们接下来看看,我们日常工作中的特性的使用。

构建自定义特性类

我们该怎么构建自己的特性呢?

.NET FRAMEWORK 类库框架中所有特性类都是派生于Attribute这个基类。

所以我们自定义的特性类代码将类似于下面的内容:

[AttributeUsage(AttributeTargets.Class| AttributeTargets.Property)]  
public class MyAttribute:Attribute  
{
    ///相关属性 字段  
    public  MyAttribute(){
        //构造方法  
    }
}  

这么写完,我们就能用这个特性了。
一些名词的解释:

  1. [AttributeUsage()] 表示本特性类作用的范围。编译的时候直接调用该构造方法

  2. 参数:需要传递枚举Enum类型值,上面代码中表示本特性只能作用于类级别或者是属性级别

这里有个知识点:原来方法中传入enum类型的值可以用' | '来表示传入多个。

ok,我们构建了自己的特性类,我们该怎么用?

自定义特性上战场之:寄生

目前为止,我们已经构建了自己的特性:MyAttribute类,接下来我们让他像寄生虫一样寄生到别的类上面。

直接上一个Model类:

///本类是模型类,表示所有人,或者数据库里面有一张people这样的数据表  
[My()]
public class people{
    private string personname;    
    [My()]
    public string Personname{
        get{ return this.personname;} 
        set{this.personname=value;}
    }    
}

ok,成功让MyAttribute寄生到people类中。可能大家会对其中的代码存在一些疑问,我们一一进行讲解:

  1. [My()]是什么? My是MyAttribute的缩写,比如YourAttribute在使用的时候,就可以缩写为:[Your()]

  2. My()告诉编译器,这里是特性类,你需要实例化这个特性类,如果特性类构造方法有参数的,可以传参。

注意点:自定义特性类的时候,不能是静态的类型,也就是static不能用来修饰类名,否则编译的时候怎么实例化呢?

构建好了,寄生也完成了,那么我们怎么用啊? 下面就要寄出一个高端货了。

自定义特性上战场之:获取

目前为止,我们完成了两个步骤:构建特性类、寄生特性类。
完整的步骤就剩一下一步:获取特性类记录的数据。
完成了这个,革命就成功了。

代码驾到:

public static class DoAttr{
    public static string CheckAttr(people p){
        if(p!=null){
            Type type=p.GetType();
            PropertyInfo propertyMy=type.GetProperty("Personname");//反射获取该属性  
            //接下来获得我们的特性   
            var myattr=(MyAttribute)propertyMy.GetCustomAttribute(typeof(MyAttribute),false);  
            string personnme=myattr.Personname;
            return personname;
        }
        else {
            return null;
        }
    }
}

ok了,我们通过该方法获取了people类的一些额外的数据信息,这个数据信息获得之后,随便我们怎么弄了,展示在网页上,存储到数据库都可以了。
这里有一个注意点:
当我们通过反射获取特性的时候,命名空间请写上,写全。

我们总结一下:特性是类级别的,也意思就是寄生了特性的类,所有实例化的对象都具备了相同的特性信息,所以,特性是类级别上的额外属性。


很多人问:学C#什么用?工作机会少得可怜。别的我就不说了,学C#你就可以结合Unity做AR啊!微软的全息眼镜,科技感十足啊。
VS2017出来啦,号称这个星球上最屌的IDE,据说体验很好,赶紧下起来。
如果想要源代码,请留言哦。

本文转自 https://www.jianshu.com/p/ea74ce9f0974,如有侵权,请联系删除。

posted @ 2022-04-12 17:11  yassine  阅读(141)  评论(0编辑  收藏  举报