特性应用

取得枚举类型的注释

平时开发时,经常会用到枚举类型及其相关判断,而有时我们想显示枚举类型的注释,怎么办?下面用特性来解决这个问题。

namespace AttributeDemo.CustomAttributes
{
public class RemarkAttribute : Attribute
{
private readonly string remark; public RemarkAttribute(string remark)
{
this.remark = remark;
} public string GetRemark()
{
return remark;
}
}
} namespace AttributeDemo.Extensions
{
public enum UserState
{
/// <summary>
/// 正常
/// </summary>
[RemarkAttribute("正常")]
Normal = 0,
/// <summary>
/// 冻结
/// </summary>
[RemarkAttribute("冻结")]
Frozen,
/// <summary>
/// 删除
/// </summary>
[RemarkAttribute("删除")]
Deleted
} public static class RemarkExtension
{
public static string GetRemark(this Enum value)
{
Type type = value.GetType();
FieldInfo field = type.GetField(value.ToString());
if (field.IsDefined(typeof(RemarkAttribute), true))
{
RemarkAttribute attr = field.GetCustomAttribute<RemarkAttribute>();
return attr.GetRemark();
}
return value.ToString();
}
} }

使用

UserState userState = UserState.Normal;
Console.WriteLine(userState.GetRemark());

数据有效性检查

一般对于用户提交的数据,我们都需要进行数据有效性的检查,之后才能提交到数据库。本次我们使用特性,优雅的解决这个问题。

声明检查数据长度的特性(因为想把数据校验作为一个共通处理,因此需要首先声明一个抽象类):

namespace AttributeDemo.CustomAttributes
{ public abstract class CustomValidateAttribute : Attribute
{
public abstract bool Validate(object value);
} public class LengthValidateAttribute : CustomValidateAttribute
{
private readonly int minLen;
private readonly int maxLen; public LengthValidateAttribute(int minLen, int maxLen)
{
this.minLen = minLen;
this.maxLen = maxLen;
} public override bool Validate(object value)
{
if (value != null && !string.IsNullOrEmpty(value.ToString()))
{
int len = value.ToString().Length;
if (len >= minLen && len <= maxLen)
{
return true;
}
}
return false;
}
}
}

把特性附加到类中

namespace AttributeDemo
{
//可以对类整体使用
[CustomAttribute(description:"类特性示例",remark: "类特性")]
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
[LengthValidateAttribute(16, 100)]//追加对邮箱的长度检查
public string EMail { get; set; }
//可以对属性字段使用
[CustomAttribute(description: "属性示例", remark: "属性特性")]
[LengthValidateAttribute(6, 9)]//追加对电话号码的长度检查
public string PhoneNumber { get; set; }
//可以对方法使用
[CustomAttribute(description: "方法示例", remark: "方法特性")]
public void Study()
{
Console.WriteLine($"{Name}正在学习中。。。");
}
//可以对返回值使用
[return: CustomAttribute(description: "返回值示例", remark: "返回值特性")]
public string SayHi([CustomAttribute(description: "参数示例", remark: "参数特性")] string name)//可以对参数列表使用
{
return $"Hello {name}";
}
}
}

再对Student类添加一个扩展方法(如果想对更广泛范围的对象进行数据校验,可以对它们的基类追加扩展方法):

public static class ValidateExtension
{
public static bool Validate(this Student value)
{
int errCount = 0; Type type = value.GetType();
PropertyInfo[] properties = type.GetProperties();
foreach (PropertyInfo property in properties)
{
if (property.IsDefined(typeof(CustomValidateAttribute), true))
{
IEnumerable<CustomValidateAttribute> attris = property.GetCustomAttributes<CustomValidateAttribute>();
foreach (CustomValidateAttribute attr in attris)
{
if (!attr.Validate(property.GetValue(value)))
{
Console.WriteLine($"数据校验失败:字段[{property.Name}]");
errCount++;
}
}
}
} return errCount == 0 ? true : false;
}
}

调用数据校验:

Student stu = new Student
{
Id = 1,
EMail = "xxxxx@xxxx.com",
Name = "brein",
PhoneNumber = "1234567890"
};
stu.Validate();

输出校验结果:

数据校验失败:字段[PhoneNumber]
数据校验失败:字段[EMail]


以上,是两个平时用的比较多的关于特性的应用场景。在ASP.NET Core中,特性还有更多应用场景,例如:FilterValidateMVC/API相关特性, AOP应用等等。可以说特性无处不在且非常重要。充分掌握特性相关知识,是掌握ASP.NET Core的充分必要条件。

【C#特性】 Attribute 应用的更多相关文章

  1. [C#] 剖析 AssemblyInfo.cs - 了解常用的特性 Attribute

    剖析 AssemblyInfo.cs - 了解常用的特性 Attribute [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5944391.html 序 ...

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

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

  3. C# 知识特性 Attribute

    C#知识--获取特性 Attribute 特性提供功能强大的方法,用以将元数据或声明信息与代码(程序集.类型.方法.属性等)相关联.特性与程序实体关联后,可在运行时使用"反射"查询 ...

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

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

  5. .Net内置特性Attribute介绍

    特性Attribute概述 特性(Attribute)是一种特殊的类型,可以加载到程序集或者程序集的类型上,这些类型包括模块.类.接口.结构.构造函数.方法.字段等,加载了特性的类型称之为特性的目标. ...

  6. 【点滴积累】通过特性(Attribute)为枚举添加更多的信息

    转:http://www.cnblogs.com/IPrograming/archive/2013/05/26/Enum_DescriptionAttribute.html [点滴积累]通过特性(At ...

  7. 理解特性attribute 和 属性property的区别 及相关DOM操作总结

    查一下英语单词解释,两个都可以表示属性.但attribute倾向于解释为特质,而property倾向于解释私有的.这个property的私有解释可以更方便我们下面的理解. 第一部分:区别点 第一点:  ...

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

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

  9. C# 知识特性 Attribute,XMLSerialize,

    C#知识--获取特性 Attribute 特性提供功能强大的方法,用以将元数据或声明信息与代码(程序集.类型.方法.属性等)相关联.特性与程序实体关联后,可在运行时使用“反射”查询特性,获取特性集合方 ...

  10. c#特性attribute:

    特性是被编译到metadata中,  是提供给反射用的. 特性attribute:1 什么是attribute,和注释有什么区别 2 声明和使用attribute3 使用attribute完成扩展4 ...

随机推荐

  1. 508. Most Frequent Subtree Sum

    Given the root of a tree, you are asked to find the most frequent subtree sum. The subtree sum of a ...

  2. pytest文档6-allure-pytest

    allure-pytest 环境准备 windows环境相关: python 3.6版本pytest 4.5.0版本allure-pytest 2.8.6 最新版 使用pip安装pytest和allu ...

  3. DNS主从同步部署

    DNS 主从同步原理 主从同步:主每次修改配置文件需要修改一下序列号,主从同步主要 根据序列号的变化. 从DNS:从可以单独修改,主从不会报错.但从修改后,主端同步给从后 从端修改数据会丢失 主从原理 ...

  4. js文件中三斜杠注释///reference path的用途

    编辑某个js文件时,要想这个js文件出现其他js成员的ide提示,可以在js文件开头使用3个斜杠注释和reference指令的path指向此js文件路径,这样在编写这个js文件时,ide就会自动出现p ...

  5. Activity 不只有跳转。功能篇(一)

    Activity生命周期 1:activity四种启动方式 standard,SingleTask,SingleTop,SingleInstance standard:是系统默认的,每次启动该acti ...

  6. BIMFACE 二次开发 SDK 之歌

    <BIMFACE SDK 之歌>讲述了作者与 BIMFACE 从相识.相知.相爱.相守的艳遇之爱唯美故事   我是一个小小的程序员 穿行在人来人往的IT行业之间 编程工作与建筑信息化相关 ...

  7. Java面试必问之线程池的创建使用、线程池的核心参数、线程池的底层工作原理

    一.前言 大家在面试过程中,必不可少的问题是线程池,小编也是在面试中被问啥傻了,JUC就了解的不多.加上做系统时,很少遇到,自己也是一知半解,最近看了尚硅谷阳哥的课,恍然大悟,特写此文章记录一下!如果 ...

  8. JAVA多线程学习五:线程范围内共享变量&ThreadLocal

    一.概念 可以将每个线程用到的数据与对应的线程号存放到一个map集合中,使用数据时从这个集合中根据线程号获取对应线程的数据,就可以实现线程范围内共享相同的变量. 二.代码 Runnable中的run( ...

  9. Ubuntu好用的文本编辑器-SciTE Text Editor

    Ubuntu下除了gedit之外,还可以使用SciTE编辑器,非常方便,安装 sudo apt install scite 不过刚刚装好在中文环境下还是不能够用的,因为会有中文乱码,还有很多设置也不符 ...

  10. 【转】性能测试报告模板 V1.0

    1. 测试项目概述与测试目的 1.1 项目概述  本部分主要是针对即将进行压力测试的对象(接口.模块.进程或系统)进行概要的说明,让人明白该测试对象的主要功能与作用及相关背景. 1.2 测试目标  简 ...