特性类的使用过程:

第一步:定义一个特性类,定义一些成员来包含验证时需要的数据;
第二步:创建特性类实例;
创建一个特性类的实例,里面包含着验证某一个属性或者字段需要的数据。
将该实例关联到某个属性上面。
第三步:使用特性类实例
可以通过调用某个类型的GetProperties()方法,获取属性,
然后调用类型属性成员的GetCustomAttributes()方法,获取该属性关联的特性类实例,
然后使用查找到的特性类实例验证新建对象。

第一步:定义特性类

第二步:创建一个特性类的实例,并关联一个属性

public class Order
{
[StringLength("订单号", 6, MinLength = 3, ErrorMessage = "{0}的长度必须在{1}和{2}之间!")]//实例化一个特性类,关联到一个字段上面
public string OrderID { get; set; }
}

第三步:使用特性类实例,进行验证

class Program
{
#region 使用特性类的过程 //验证过程
//1.通过映射,找到成员属性关联的特性类实例,
//2.使用特性类实例对新对象的数据进行验证 //用特性类验证订单号长度
public static bool isIDLengthValid(int IDLength, MemberInfo member)
{
foreach (object attribute in member.GetCustomAttributes(true)) //2.通过映射,找到成员属性上关联的特性类实例,
{
if (attribute is StringLengthAttribute)//3.如果找到了限定长度的特性类对象,就用这个特性类对象验证该成员
{
StringLengthAttribute attr = (StringLengthAttribute)attribute;
if (IDLength < attr.MinLength || IDLength > attr.MaxLength)
{
string displayName = attr.DisplayName;
int maxLength = attr.MaxLength;
int minLength = attr.MinLength;
string error = attr.ErrorMessage;
Console.WriteLine(error, displayName,maxLength, minLength);//验证失败,提示错误
return false;
}
else return true;
} }
return false;
} //验证订单对象是否规范
public static bool isOrderValid(Order order)
{
if (order == null) return false;
foreach (PropertyInfo p in typeof(Order).GetProperties())
{
if (isIDLengthValid(order.OrderID.Length, p))//1记录下新对象需要验证的数据,
return true;
}
return false; }
#endregion
public static void Main()
{
Order order=new Order();
do
{
Console.WriteLine("请输入订单号:");
order.OrderID= Console.ReadLine();
}
while (!isOrderValid(order));
Console.WriteLine("订单号输入正确,按任意键退出!");
Console.ReadKey();
} }

总结:特性类的实例里没有验证逻辑,只有验证用到的规范数据(比如字符串长度)、提示信息等。验证逻辑需要自己写。

C#特性类的使用的更多相关文章

  1. paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型

    paip.java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...

  2. C# 所有特性,特性所在命名空间,那些命名空间拥有特性类

    文章持续补充中 特性并不是集中在某一命名空间中,而是不同的特性在不同的命名空间下,特性是某一命名空间下提供的语法糖. 有哪些命名空间提供特性: 命名空间 描述 Microsoft.Build.Fram ...

  3. Net特性类Description了解下

    NET特性类都有个特点类名+Attribute,继承基类Attribute,我们看下微软自带的特性类:DescriptionAttribute namespace System.ComponentMo ...

  4. 前端笔记之ES678&Webpack&Babel(中)对象|字符串|数组的扩展&函数新特性&类

    一.对象的扩展 1.1对象属性名表达式 ES6可以在JSON中使用[]包裹一个key的名字.此时这个key将用表达式作为属性名(被当做变量求值),这个key值必须是字符串. var a = 'name ...

  5. day20面向对象三大特性 , 类嵌套

    #!/usr/bin/env python# -*- coding:utf-8 -*- # 1.简述面向对象三大特性并用代码表示."""封装:class Account: ...

  6. 003.ES2015和ES2016新特性--类.md

    JavaScript使用的是基于原型的OO模型,用对象字面量或者函数来实例化对象,用原型链来实现继承. 这样对于数据传统C++.Java的OO范式的开发者来说,会感到比较困惑,于是从ES2015开始逐 ...

  7. 2.ES6引进的新特性——类Class

    为什么? ES6中引入了类,类在java/c++等面向对象的编程语言常见,JS引入类是为了在日后使用js开发大型的应用程序,类本质是语法糖(语法上更加人性化) 以前写一个类 function User ...

  8. c#特性类 Attribute

    Attribute FYI Link: Attribute在.net编程中的应用(一) Attribute在.net编程中的应用(二) Attribute在.net编程中的应用(三) Attribut ...

  9. .NET技术-1.0.使用反射、特性简化代码(验证Model类)

    使用反射.特性简化代码 参考项目:利用反射验证Model类/AssemblyVerification 假设现在有一个学生类(Student) /// <summary> /// 学生类 / ...

随机推荐

  1. poj Pseudoprime numbers 3641

    Pseudoprime numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10903   Accepted: 4 ...

  2. CCCC L2-024 部落【并查集】

    https://www.patest.cn/contests/gplt/L2-024 首先在一行中输出这个社区的总人数.以及互不相交的部落的个数.随后对每一次查询,如果他们属于同一个部落,则在一行中输 ...

  3. HDU 5266 pog loves szh III(区间LCA)

    题目链接 pog loves szh III 题意就是  求一个区间所有点的$LCA$. 我们把$1$到$n$的$DFS$序全部求出来……然后设$i$的$DFS$序为$c[i]$,$pc[i]$为$c ...

  4. PageHelper分页工具

    <a>共${page.total}件商品</a>    <a>共${page.pages}页</a>    <a>当前第${page.pag ...

  5. 访问权限修饰符Protected专题

    上图描述:A类在a包下,m()方法被protected修饰 上图描述:B类也在a包下,B类是A类的子类. 解析:B类和A类是同包类,B类是A类的子类,因此b对象可以调用m()方法. 上图描述:C类也在 ...

  6. datetimepicker使用总结

    datetimepicker使用总结 2019-03-06    16:55:00 使用效果: 官方教程:http://www.bootcss.com/p/bootstrap-datetimepick ...

  7. fastjson的序列化属性

    在将使用JSON.toJSONString(result, SerializerFeature.PrettyFormat)将JSONObject转化为字符串时,可以指定一些序列化属性,设置转化后的字符 ...

  8. Windows Server 2003中报PerfDisk “无法从系统读取磁盘性能信息。

    Windows Server 2003中报PerfDisk “无法从系统读取磁盘性能信息.”的问题解决 2015-01-22 09:49:02 标签:Windows Server2003 PerfDi ...

  9. Android入门:MVC模式(中)

    MVC 模式的最基本概念是分层设计,把我们的代码基于 View(视图).Model(模型).Controller(控制器)进行分类封装,这样做的目的是为了清晰结构,使代码更易维护和扩展. 在上一篇文章 ...

  10. react 获取 input 的值

    1.通过 onChange -- e.target.value class App extends Component { state = { username: '张三' }; // 用户名 get ...