一、特性Attribute和注释有什么区别

特性Attribute

  A:就是一个类,直接继承/间接继承Attribute

  B:特性可以在后期反射中处理,特性本身是没有什么*用的

  C:特性会影响编译和运行时功能

注释

  A:就是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码。注释是编写程序时,写程序的人给一个语句、程序段、函数等的解释或提示,能提高程序代码的可读性

  B:注释不能后期处理

二、自定义Attribute特性的使用

自定义Attribute特性的语法

其实特性就是一个类,直接继承或者间接的继承Atrribute的就是一个特性

首先声明特性,以下面的代码举个例子

//直接继承Attribute
public class CustomAttribute : Attribute
{
public string Name { get; set; } public CustomAttribute()
{
Console.WriteLine($"{this.GetType().Name} 无参构造函数");
} public CustomAttribute(string name)
{
Console.WriteLine($"{this.GetType().Name} string 参数构造函数");
Name = name;
}
} //间接继承Attribute
public class CustomAttributeChild : CustomAttribute
{
public CustomAttributeChild()
{
Console.WriteLine($"{this.GetType().Name} 无参构造函数");
} public CustomAttributeChild(string name) : base(name)
{
Console.WriteLine($"{this.GetType().Name} string 参数构造函数");
}
}

特性的使用

首先我们准备一个自定义特性DisplayName

自定义特性

/// <summary>
/// 是给属性和字段 提供一个额外信息
/// AllowMultiple特性影响编译器,AttributeTargets修饰的对象 AllowMultiple:能否重复修饰 Inherited:是否可继承
/// 可以指定属性和字段
/// </summary>
namespace Ramon.Common.CustomAttribute
{
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public sealed class DisplayNameAttribute : Attribute
{
public string Name { get; }
public DisplayNameAttribute(string sValue)
{
Name = sValue;
}
}
}

在CompanyModel的属性上使用DisplayName的特性

BaseModel

namespace Ramon.Common.Framework
{
public class BaseModel
{
public int Id { get; set; }
}
}

CompanyModel

namespace Ramon.Model.Model
{
public class CompanyModel : BaseModel
{
[DisplayName("公司名称")]
public string Name { get; set; } [DisplayName("创建日期")]
public DateTime CreateTime { get; set; } [DisplayName("创建人Id")]
public int CreatorId { get; set; } [DisplayName("最后修改人Id")]
public int? LastModifierId { get; set; } [DisplayName("最后修改时间")]
public DateTime? LastModifyTime { get; set; }
}
}

我们标识了这些特性到底要怎么使用呢?

文章的开始就已经说了特性可以在后期反射中处理,特性本身是没有什么*用的

那么我们通过反射如何去使用特性

接下来以上面给出的代码去实现,定义了一个扩展方法

用到了反射和泛型等知识,如果有小伙伴不懂可参考以下文章
反射:https://www.cnblogs.com/Ramon-Zeng/p/10189097.html
泛型:https://www.cnblogs.com/Ramon-Zeng/p/10172818.html

 public static class BaseModelExtenstion
{
public static void ConsoleEntity<TEntity>(this TEntity tEntity) where TEntity : BaseModel
{
Type type = tEntity.GetType();
PropertyInfo[] propInfos = type.GetProperties();
foreach (var prop in propInfos)
{
string parameterName = prop.Name;
if (prop.IsDefined(typeof(DisplayNameAttribute), false))
{
DisplayNameAttribute attribute = (DisplayNameAttribute)prop.GetCustomAttribute(typeof(DisplayNameAttribute), false);
parameterName = attribute.Name.IsNullOrWhiteSpace() ? prop.Name : attribute.Name;
}
Console.WriteLine($"{parameterName}:{prop.GetValue(tEntity)}");
}
}
}

代码调用

class Program
{
static void Main(string[] args)
{
CompanyModel companyModel = new CompanyModel()
{
Id = ,
Name = "Ramon----集团",
CreateTime = DateTime.Now,
CreatorId = ,
}; companyModel.ConsoleEntity(); }
}

结果

二:特性的运用范围

特性运用范围极其广,框架中我们看到上面的总结就晓得了,下面的我总结了以下几个地方也可以使用特性

1:数据展示 不想展示属性名字,而是用中文描述
2:想指定哪个是主键,哪个是自增
3:别名 数据库里面叫A 程序是B,怎么映射等

然后特性还可以校验一些数据字段等,下面我写个例子,以便更加容易理解:

1:先创建数据校验的特性

 

2:再一个实体类上面的字段增加特性

 

3:写下面的方法,使特性生效

 

4:应用判断时如下:

 

这样就完成了数据校验,特性校验的特点,总结得到了如下三点:

1:可以校验多个属性
2:可以支持多重校验
3:支持规则的随意扩展

运用了这个特性校验后,就不用再每个地方再分别写校验的逻辑,简单易用!

参考文章:https://www.cnblogs.com/loverwangshan/p/10153832.html

C# 自定义特性Attribute的更多相关文章

  1. 如何获取类或属性的自定义特性(Attribute)

    如何获取类或属性的自定义特性(Attribute) 问题说明: 在ActiveRecord或者其他的ORM等代码中, 我们经常可以看到自定义特性(Attribute)的存在(如下面的代码所示) [Pr ...

  2. C# 自定义特性(Attribute)详解

    什么是特性 特性的定义:公共语言运行时允许添加类似关键字的描述声明,叫做attribute,它对程序中的元素进行标注,如类型.字段.方法.和属性等.attribute和.NetFramework文件的 ...

  3. 【.net 深呼吸】自定义特性(Attribute)的实现与检索方法

    在.net的各个语言中,尤其是VB.NET和C#,都有特性这一东东,具体的概念,大家可以网上查,这里老周说一个非标准的概念——特性者,就是对象的附加数据.对象自然可以是类型.类型成员,以及程序集. 说 ...

  4. .Net 特性 attribute 学习 ----自定义特性

    什么是特性? [Obsolete("不要用无参构造函数",true)] 放在方式上, 该方法就不能使用了  [Serializable]放在类上面.该类就是可以序列化和反序列化使用 ...

  5. 代码走查25条疑问 C# 跳转新的标签页 C#线程处理 .Net 特性 attribute 学习 ----自定义特性 看懂 ,学会 .NET 事件的正确姿势-简单版

    代码走查25条疑问   代码走查(Code Review) 是一个开发人员与架构师集中讨论代码的过程.通过代码走查可以提高代码的 质量,同时减少Bug出现的几率.但是在小公司中并没有代码走查的过程在这 ...

  6. C#提高--------------获取方法返回值的自定义特性(Attribute)

    .NET(C#):获取方法返回值的自定义特性(Attribute) 转载 2013年05月08日 10:54:42 1456 来自:http://www.cnblogs.com/mgen/archiv ...

  7. Attribute自定义特性+Asp.net MVC中的filter详解

    转载自:http://blog.csdn.net/wangyy130/article/details/44241957 一.filter简介 在了解自定义特性前,先引入一个概念filter,它是MVC ...

  8. [C#] C# 知识回顾 - 特性 Attribute

    C# 知识回顾 - 特性 Attribute [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5911289.html 目录 特性简介 使用特性 特性 ...

  9. 区分元素特性attribute和对象属性property

    × 目录 [1]定义 [2]共有 [3]例外[4]特殊[5]自定义[6]混淆[7]总结 前面的话 其实attribute和property两个单词,翻译出来都是属性,但是<javascript高 ...

随机推荐

  1. Android 虚拟多开系列一——技术调研

    参考链接:http://weishu.me Github源码链接:             国内Xposed框架源码链接                               VirtualAp ...

  2. 修改zabbix为中文,并解决乱码问题(三)

    当Zabbix安装完成后,默认则是英文界面,有的人看英文不习惯,现在将其改为中文界面 一.修改为中文 1.打开Zabbix界面,Administrator-Users 选择语言-Chinese(zh_ ...

  3. SQL创建视图

    1.视图的理解 从用户角度来看,一个视图是从一个特定的角度来查看数据库中的数据 .从数据库系统内部来看,一个视图是由SELECT语句组成的查询定义的虚拟表 .从数据库系统内部来看,视图是由一张或多张表 ...

  4. ASP.net Substitution 页面缓存而部分不缓存的实现方法

    在ASP.NET中要实现部分内容非缓存,而其它的都需要缓存输出,可以使用Substitution控件实现. <%@ Page Language="C#" AutoEventW ...

  5. 使用CALayer制作View的辉光效果

    使用CALayer制作View的辉光效果 实现以下的辉光效果: 思路是这样子的: 1. 创建好需要实现辉光效果的View 2. 对这个View进行截图 3. 将这个截图重新添加进View中 4. 对这 ...

  6. Visual Studio Code (vscode)编译C++

    Visual Studio Code (简称 VS Code / VSC) 是一款免费开源的现代化轻量级代码编辑器,支持几乎所有主流的开发语言的语法高亮.智能代码补全.自定义热键.括号匹配.代码片段. ...

  7. U-Mail邮件营销可视化编辑设计邮件模板so easy

    相信每位看过军事演习的朋友都知道,现代战争越来越就像一场沙盘演练,真正做到了“运筹帷幄之中决战千里之外”,后方坐镇指挥战斗的能够将前线战场变得透明,这就叫“可视化战争”,做到了<孙子兵法> ...

  8. CRITICAL **: Couldn't acquire global lock, snapshots will not be consistent: Access denied

    报错如下:** (mydumper:56288): CRITICAL **: Couldn't acquire global lock, snapshots will not be consisten ...

  9. MongoDB authentication failed

    0.随笔摘要: MongoDB  安装配置 MongoDB  权限控制 MongoDB  注意事项 authentication failed 1.MongoDB  下载安装配置 MongoDB官网  ...

  10. PhoneGap检测设备网络连接情况

    一.网络连接状态列表 Phonegap 网络连接通过 navigator.network.connection.type 来获取,一般有一下几种状态 1. Connection.UNKNOWN     ...