特性应用

取得枚举类型的注释

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

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. 返回void-(响应ajax,响应json格式)(了解)

    将jquery库文件加入到idea中 引入json依赖 index.jsp中 设置按钮发起ajax请求 从处理器方法返回void,响应ajax请求 MyController中

  2. 平滑增加Nginx模块

    目录 一:平滑增加Nginx模块 1.1.增加模块必须重新编译 一:平滑增加Nginx模块 1.1.增加模块必须重新编译 解决依赖 编译安装不能解决依赖 yum install zlib zlib-d ...

  3. Vue3源码分析之 Ref 与 ReactiveEffect

    Vue3中的响应式实现原理 完整 js版本简易源码 在最底部 ref 与 reactive 是Vue3中的两个定义响应式对象的API,其中reactive是通过 Proxy 来实现的,它返回对象的响应 ...

  4. c++ constexpr用法

    测试环境:windows10 + gcc8.1 1.constexpr产生背景 c++11以后,为了保证写出的代码比以往任何时候的执行效率都要好而进行了许多改善.其中,这种改善之一就是生成常量表达式, ...

  5. Redis 学习笔记(四)RDB 和 AOF 持久化机制

    一.Redis 持久化简介 Redis 的持久化功能是区别于 Memcached 显著特性,数据持久化可以保证系统在发生宕机和重启后数据不会丢失,对于 redis 这种存储在内存中的数据库显得尤为重要 ...

  6. 多种方式告诉你如何计算DM同步数据到TiDB的延时时间

    背景 用户在做技术选型的过程中,总是会对一些数据指标比较关心,特别是在和竞品相比较的时候,更加需要一些有说服力的数据.基于MySQL开发的项目在迁移到TiDB的时候,使用DM同步数据是必不可少的一个环 ...

  7. maven的三种项目打包方式----jar,war,pom

    1.pom工程:**用在父级工程或聚合工程中.用来做jar包的版本控制.必须指明这个聚合工程的打包方式为pom 2.war工程:将会打包成war,发布在服务器上的工程.如网站或服务.在SpringBo ...

  8. Mybatis foreach的用法

    本文援引:https://www.cnblogs.com/fnlingnzb-learner/p/10566452.html 在做mybatis的mapper.xml文件的时候,我们时常用到这样的情况 ...

  9. python继承关系中,类属性的修改

    class Grandfather(object): mylist = [] def __init__(self): pass class Father(Grandfather): pass Gran ...

  10. 把 Navigation Bar 下面那条线删掉的最简单的办法! — By: 昉

    系统默认的 Navigation Bar 下面一直有条线,翻尽了文档却没找到能把它弄走的相关接口,处女座的简直木法忍啊有木有!!!! 研究了一下navigationBar下的子视图,原来只需要几行代码 ...