当前位置: 首页 > 科技观察

五分钟搞懂C#特性

时间:2023-03-15 14:47:38 科技观察

前言在工作或学习中,或多或少接触到特性是不可避免的。可能你不知道什么是特性,我举两个例子[Obsolete]、[HttpGet]、[HttpPost]、[Serizlized]、[AuthorizeFilter](一定有你见过的)。觉得眼熟就跟着小赵一探究竟吧。属性用于添加元数据,例如编译器指令和注释、描述、方法、类和其他信息。属性的名称和值在方括号内指定,放在它所应用的元素之前。positional_parameters指定必填信息,name_parameter指定可选信息。Attribute定义Attribute定义:直接或间接继承Attribute类定义,可以直接在方法前面使用[CustomAttribute],可以省略Attribute,在属性类上写[Custom]///AttributeTargets.All--即可被修改的Application属性///AllowMultiple=true---是否可以多次修改[AttributeUsage(AttributeTargets.All,AllowMultiple=true)]图片特征的usefeature本身没有用,但是可以用通过反射来增加功能。不会破坏原有的封装通过反射,找到特征-实例化特征-利用特征通过特征获取表名(orm)是个好案例先定义一个类,假装和表结构一样在数据库中,但是显示t_student可以通过两种方法获取表名(方法1增加字段,或者扩展方法tostring,但是都破坏了之前的封装,不推荐这种方式),然后使用feature今天学习了publicclassStudent{//publicstaticstringtablename="t_student";//publicstringtostring()//{//return"t_student";//}publicintid{get;set;}publicstringName{get;set;}publicintSex{get;set;}}在定义特性类TableNameAttribute//1中。declarepublicclassTableNameAttribute:Attribute{privatestring_name=null;//初始化构造函数publicTableNameAttribute(stringtablename){this._name=tablename;}publicstringGetTableName(){returnthis._name;}}然后在student前面添加自定义的Feature实现功能扩展方法//通过反射获取表名publicstaticstringGetName(Typetype){if(type.IsDefined(typeof(TableNameAttribute),true)){TableNameAttributeattribute=(TableNameAttribute)type.GetCustomAttribute(typeof(TableNameAttribute),true);returnattribute.GetTableName();}else{returntype.Name;}}F5执行,查看运行结果汇总特征本身是not没有什么用,但是可以通过反射使用,在不破坏原有打包工程的情况下,增加功能。我把它放在我的github[1]https://github.com/PrideJoy/NetTemple/tree/master/%E7%89%B9%E6%80%A7