首页 > 编程语言 >C#中的特性 Attribute

C#中的特性 Attribute

时间:2022-10-31 04:22:05浏览次数:30  
标签:定义 C# Attribute 特性 class TableAttribute public

特性:本质就是一个类,且必须继承至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

相关文章

  • iOS数据持久化 - CoreData
    前言1-CoreData是苹果公司封装的进行数据持久化的框架,首次在iOS3.0版本系统中出现,它允许按照实体-属性-值模型组织数据,并以XML、二进制文件或者SQLite数据文件的......
  • CSS笔记 - 几种水平垂直居中方式
    水平垂直居中的方式对比目录水平垂直居中的方式对比绝对定位的方式table-cell的方式transform的方式flex的方式绝对定位的方式/*这种居中方式,只适用于元素的大小确定时......
  • QML 怎么调用 C++ 中的内容?
    以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「englyf」https://mp.weixin.qq.com/s/z_JlmNe6cYldNf11Oad_JQ先说明一下测试环境编译器:vs2017x64开发......
  • CentOS7 配置FTP服务器
    [root@TS004~]#yuminstallvsftpd     //安装VSftp应用[root@TS004~]#systemctlenablevsftpd   //设置开机启动[root@TS004~]#servicevsftpdsta......
  • CentOS7重启命令+关机命令
    [root@TS004~]#reboot  //重启命令[root@TS004~]# shutdown  // 重启命令[root@TS004~]#shutdown-rnow  //立即重启[root@TS004~]#shutdown-r+......
  • 2流高手速成记(之六):从SpringBoot到SpringCloudAlibaba
    咱们接上回2流高手速成记(之五):Springboot整合Shiro实现安全管理-14号程序员-博客园(cnblogs.com)身边常有朋友说:小项目用PHP、大项目用Java(这里绝无贬低PHP技术栈之......
  • cf
    10.31DivisibilitybyEight(1500)题目大意:给你一个不包含前导0的整数,位数100位,问是否可以在通过删除一些位数,且不能改变原有位置的情况下整除8?解题思路:我们可以发现1000......
  • CentOS7 修改主机名称
    [root@TS004~]# vi/etc/hosts  //打开主机名信息编辑文件弹出Hosts文件内容,按键盘上的【Insert】键,使编辑的内容为可插入编辑找到localhost.domain改为server 按......
  • MVVM与MVC
      MVVM与MVC的区别有:1、mvvm各部分的通信是双向的,而mvc各部分通信是单向的;2、mvvm是真正将页面与数据逻辑分离放到js里去实现,而mvc里面未分离MVC:包括view视图层、......
  • HCIA学习笔记三十六:OSPF中的DR和BDR的选举过程
    一、DR和BDR的选举•上一节中,AR1和AR2是Priority都是等于1的情况下,AR2的RouterID:2.2.2.2明显大于AR1的RouterID:1.1.1.1,为什么AR1反而成了DR而AR2成了BDR呢?这个其实......