迷恋自留地 发表于 2021-3-29 01:53

教你完全弄懂特性

## 前言
在工作或者学习中,难免或多或少的接触到特性这个东西,可能你不太清楚什么是特性,那么我给大家举两个例子 ,,,, (总有你见过的一个吧) 。有没有觉得好熟悉,下面跟着小赵一探究竟。

>特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。

>特性(Attribute)的名称和值是在方括号内规定的,放置在它所应用的元素之前。positional_parameters 规定必需的信息,name_parameter 规定可选的信息。

## 特性的定义
特性的定义:直接或者间接的继承 Attribute 类

定义完就直接可以在方法前面用 可以省略 Attribute 写成


在特性类上面的特性
   /// AttributeTargets.All --可以修饰的应用属性
    /// AllowMultiple = true   ---是否可以进行多次修饰
   
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210328175458264.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_16,color_FFFFFF,t_0)


![在这里插入图片描述](https://img-blog.csdnimg.cn/2021032817380226.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_16,color_FFFFFF,t_0)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210328175003473.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_16,color_FFFFFF,t_0)

## 特性的使用

特性本身是没有啥用,但是可以通过反射来使用,增加功能,不会破坏原有的封装
通过反射,发现特性 --实例化特性--使用特性
通过特性获取表名(orm)就是一个很好的案例


首先定义个类,假装和数据库中的表结构一样,但表明是t_student
可以通过两个方法来获取表名(方法1加字段,或者扩展方法tostring,但都破坏了以前的封装,不提倡这样做),然后就用到今天学习的`特性attribute`了



```csharp
public class Student
    {
         //public static string tablename = "t_student";
      //public string tostring()
      //{
      //    return "t_student";
      //}
      publicint id { get; set; }
      public string Name { get; set; }
      public int Sex { get; set; }
    }
```
在定义特性类`TableNameAttribute`

```csharp
//1.声明
   publicclass TableNameAttribute:Attribute
   {
         private string _name = null;
         //初始化构造函数
      publicTableNameAttribute(string tablename)
      {
            this._name = tablename;
      }

      public string GetTableName()
      {
            return this._name;
      }
   }
```

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210329011057474.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_16,color_FFFFFF,t_0)
然后再student前面加上自定义特性
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210329013640630.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_16,color_FFFFFF,t_0)
实现特性的扩展方法

```csharp
      //通过反射获取表名
      public static string GetName(Type type)
      {
            if (type.IsDefined(typeof(TableNameAttribute),true))
            {
                TableNameAttribute attribute =(TableNameAttribute)type.GetCustomAttribute(typeof(TableNameAttribute), true);

                return attribute.GetTableName();
            }
            else
            {
            returntype.Name;
            }
      }
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210329013722257.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_16,color_FFFFFF,t_0)

![在这里插入图片描述](https://img-blog.csdnimg.cn/2021032901383653.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_16,color_FFFFFF,t_0)
F5执行,查看运行结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210329013923225.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_16,color_FFFFFF,t_0)
### 总结

特性本身是没有啥用,但是可以通过反射来使用,增加功能,不会破坏原有的封装
项目我放再我的(https://github.com/PrideJoy/NetTemple)
https://github.com/PrideJoy/NetTemple/tree/master/%E7%89%B9%E6%80%A7

13169456869 发表于 2021-3-29 03:02

感谢分享!!!

ee789852 发表于 2021-3-29 06:41

感谢分享,收藏了

JerryLia 发表于 2021-3-29 07:48

感谢分享!

鸭子咯咯哒~ 发表于 2021-3-29 07:51

特性是Java和c++都可以使用吗?还是只有面向对象编程才能用

ayzl 发表于 2021-3-29 08:48

看看,需要学的还很多

海绵宝宝好黄 发表于 2021-3-29 09:24


看看,需要学的还很多

Meehoo2019 发表于 2022-1-23 09:55

一看到方括号里面的一堆东西,不理解起什么作用,就跟着囫囵吞枣的在代码里加~~~~谢谢,很好的总结
页: [1]
查看完整版本: 教你完全弄懂特性