版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、扩展元数据本文以一个项目中通用的验证类来举例说明如何使用自定义Attribute来扩展元数据。在项目中,我们为了保证各个层次之间的松藕合,通常把在各个层次之间传递数据的封装在一个称为实体类的类中,比如ctionFromusingSystem;namespaceAttributeTestpublicclassActionFormprivatestringemail=;privatestringpassword=;publicstringEmailgetreturnthis.email;setthis.email=value;publicstringPasswordgetreturnthis.pa
2、ssword;setthis.password=value;现在,在使用这些实体类中的数据之前,我们需要对其中的数据进行验证。通常我们会写个静态类,用来提供各种不同的验证方法。比如需要验证Email,验证Password,比如:usingSystem;usingSystem.Reflection;usingSystem.Text.RegularExpressions;namespaceAttributeTestpublicclassValidatorpublicstaticboolValidateEmail(stringemail).publicstaticboolValidatePasswo
3、rd(stringpasswd).这样的硬编码混迹于各个层次之间,一旦实体类里某个属性发生变化,就不得不修改各个层次中的相关验证代码。于是,我们想到可以使用一个统一的验证方法用来验证所有的实体类中的属性。publicstaticboolValidate(stringpropertyName,stringpropertyValue,Validator.ValidateTypet).这里,Validator.ValidateType是Validator中提供的一个枚举。publicenumValidateTypeEmail,Password,Number,Id这里这个验证方法,的第三个参数使得验证
4、与实体类的耦合密度增加了。我们还是不得不在修改实体类的时候,修改验证方法的调用代码。现在,我们需要自定义Attribute来扩展实体类的元数据。通过对实体类元数据的描述,我们可以去掉验证方法里的第三个参数。usingSystem;namespaceAttributeTestSystem.AttributeUsage(AttributeTargets.Property)publicclassValidateAttribute:System.AttributepublicValidateAttribute(ValidateTypevalidateType)this.validateType=val
5、idateType;privateValidateTypevalidateType;publicValidateTypeValidateTypegetreturnthis.validateType;setthis.validateType=value;publicenumValidateTypeEmail,Password,Number,Id自定义Attribute(特性)必须继承于System.Attribute。还可以通过System.AttributeUsageAttribute特性,控制自定义特性的使用范围(构件),例如,字段、方法。System.AttributeUsage(Attr
6、ibuteTargets.Property)限制这个自定义特性只能使用在类的属性上。现在,我们实现这个验证方法:usingSystem;usingSystem.Reflection;usingSystem.Text.RegularExpressions;namespaceAttributeTestpublicclassValidatorpublicstaticboolValidate(objectvalidateObject,stringvalidateProperty)System.Typet=validateObject.GetType();PropertyInfopi=t.GetProp
7、erty(validateProperty);stringvalidateValue=pi.GetValue(validateObject,null)asstring;if(pi.IsDefined(typeof(ValidateAttribute),true)objectatts=pi.GetCustomAttributestr(ue);ValidateAttributevatt=atts0asValidateAttribute;stringstrExpr=;switch(vatt.ValidateType)caseValidateType.Email:strExpr=A/w-+(/./w-
8、+)*/w-+(/./w-+)+$;break;caseValidateType.Password:strExpr=/d6;break;caseValidateType.Number:strExpr=A/d*$;break;caseValidateType.Id:strExpr=A/w*$;break;default:returntrue;RegexvalidateRegex=newRegex(strExpr);returnvalidateRegex.IsMatch(validateValue);returntrue;该方法需要两个参数,一个是需要验证的实体类的实例,还有一个是需要验证的属性名
9、。当然,我们还需要在实体类上加上我们自定义的特性:usingSystem;namespaceAttributeTestpublicclassActionFormprivatestringemail=;privatestringpassword=;Validate(ValidateType.Email)publicstringEmailgetreturnthis.email;setthis.email=value;Validate(ValidateType.Password)publicstringPasswordgetreturnthis.password;setthis.password=v
10、alue;我们通过自定义特性对实体类的元数据进行扩展,指定每个属性需要验证的类型。现在我们可以这样使用这个验证类:ActionFormform=newActionForm();form.Email=;form.Password=123456;boolisValidEmail=Validator.Validate(form,Email);boolisValidPassword=Validator.Validate(form,Password);Console.WriteLine(Emailis0.,isValidEmail?valid:invalid);Console.WriteLine(Pas
11、swordis0.,isValidPassword?valid:invalid);Console.ReadLine();我们通过抛出自定义异常的方法,将验证扩大到实体类级别的验证:publicstaticvoidValidateProperty(objectvalidateObject,stringvalidateProperty)System.Typet=validateObject.GetType();PropertyInfopi=t.GetProperty(validateProperty);stringvalidateValue=pi.GetValue(validateObject,n
12、ull)asstring;if(pi.IsDefined(typeof(ValidateAttribute),true)objectatts=pi.GetCustomAttributes(true);ValidateAttributevatt=atts0asValidateAttribute;stringstrExpr=;switch(vatt.ValidateType)caseValidateType.Email:strExpr=A/w-+(/./w-+)*/w-+(/./w-+)+$;break;caseValidateType.Password:strExpr=/d6;break;cas
13、eValidateType.Number:strExpr=A/d*$;break;caseValidateType.Id:strExpr=A/w*$;break;default:return;RegexvalidateRegex=newRegex(strExpr);if(!validateRegex.IsMatch(validateValue)thrownewApplicationException(validateProperty+isinvalid.);publicstaticvoidValidate(objectvalidateObject)System.Typet=validateOb
14、ject.GetType();PropertyInfops=t.GetProperties();foreach(PropertyInfopiinps)ValidateProperty(validateObject,pi.Name);tryValidator.Validate(form);catch(Exceptionex)Console.WriteLine(ex.Message);publicstaticclassEventManagerstaticDictionarystring,Listms_subscribers=newDictionarystring,List();System.Att
15、ributeUsage(System.AttributeTargets.Property|System.AttributeTargets.Field)publicclassObserveAttribute:System.AttributeprivateclassSubscriber:ISubscriberstringm_subscribeKey;System.Actionm_handler;publicSubscriber(stringkey)m_subscribeKey=key;Subscriber()Unsubscribe();publicSystem.ActionHandlersetm_handler=value;publicvoidNotify(paramsobjectargs)if(m_handler!=null)m_handler(args);publicvoidUnsubscribe()if(string.IsNullOrEmpty(m_subscribeKey)return;/Debu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 政策性粮食销售问题研究
- 2025常压饱和吸氧专家共识课件
- 2026年重组凝血因子行业分析报告及未来发展趋势报告
- 2026年上光蜡制品行业分析报告及未来发展趋势报告
- 2026年面包虫养殖行业分析报告及未来发展趋势报告
- 2026年孕妇防辐射马甲行业分析报告及未来发展趋势报告
- 子宫肌壁手术损伤与生育功能保护2026
- 2026年养生小家电行业分析报告及未来发展趋势报告
- 大学(金融学)金融市场学2026年阶段测试题及答案
- 2026年村级后备干部考前练习题(含答案)
- 2025年csco肾癌诊疗指南
- 深度融合与创新:信息技术赋能初中数学教学新范式
- 【新教材】外研版(2024)八年级下册英语Unit 1-Unit 6语法练习册(含答案解析)
- 中国艺术研究院社会招聘试题
- 【《基于UASB-MBR工艺的垃圾渗滤液处理系统工艺计算设计案例》7400字】
- 2026年及未来5年市场数据中国硫酸钙晶须行业发展潜力分析及投资战略咨询报告
- 慢性肾病营养不良干预新策略
- 炼化企业离心压缩机干气密封技术规范
- 高铁血红蛋白血症的诊断与处理原则
- 重症医学5c考试题库及答案
- 城投集团笔试真题及答案
评论
0/150
提交评论