特性:本质就是一个类,且必须继承至Attribute类
使用场景:(框架,类,方法,属性,字段,参数,返回值....)上面,Attribute通过的一些方法,比如:字段有没有定义特性,用来做判断。
命名规范:【public class 特性名Attribute : Attribute】 定义时Attribute不能实例,使用特性时可以省略只写特性名【特性名Attribute】或【特性名】
特性简单的四个步骤:1.定义---2.使用---3.定义类:通过反射查找到这个特性---4.调用:通过定义的查找特性类去调用。
特性配置:【AttributeUsage(参数1:可以放在方法和类上面默认类等等。参数2:是否可以多重定义特性默认false。参数3:是否可以被继承,默认true。)】
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] public class TableAttribute : Attribute //1、定义特性:一个特性就是一个类,特性上面也能加特性 { public string tname { get; set; } public TableAttribute() { } public TableAttribute(string str) { this.tname = str; } } //2、使用特性----------------------------------------------------------------------------- [Serializable]//系统特性,表示可以当前类被实例化 [Table]//自定义特性 [Table("改表名")]//多重属性定义指AttributeUsage参数2:AllowMultiple可以所以多个构造方法 public class Student { [Table]//参数1配置在方法上面也能使用 public void cc() { } } public class ABC : Student { } //当AttributeUsage参数3Inherited改为false,那么也就是说,Student里的特性在ABC里不起作用。
第三步:查找-------第四步:调用
Student stu = new Student(); string str = CustomAttribute.GetTableAttribute(stu);//4.调用 Console.WriteLine(str);//获取到[Table("改表名")]里的字符串参数:改表名 public class CustomAttribute //3.定义一个类专门用来查找特性 { public static string GetTableAttribute<T>(T node) where T:class //约束泛型只能传引用类型 { Type type = typeof(T);//typeof获取到类型 if (type.IsDefined(typeof(TableAttribute), true))//帮你查找看看有没有定义这个特性,第二个参数:是否去找他的派生类 { var attribute = type.GetCustomAttributes(typeof(TableAttribute), true);//获取到这个类 return ((TableAttribute)attribute[1]).tname;//上面使用了两个特性,第一个是无参构造,我需要的是第二个值。获取的是obj类型需要强制转换为需要显示的值。 } else { return type.Name; } } }
系统自带的特性
using System.ComponentModel.DataAnnotations;//系统特性需要引用 public class Student { [Key]//主键:如果字段名是id,默认可以不写,如果是usersid这样就认不到必须定义主键。 public int Id { get; set; } [Display(Name ="姓名")]//显示字段别名 [Required]//不能为空 [StringLength(maximumLength:50,MinimumLength =6)]//字符串长度 [EmailAddress]//识别邮箱格式 public string Name { get; set; } }
自定义特性
标签:定义,C#,Attribute,特性,class,TableAttribute,public From: https://www.cnblogs.com/longxinyv/p/16842529.html