扩展元数据——推荐_第1页
扩展元数据——推荐_第2页
扩展元数据——推荐_第3页
扩展元数据——推荐_第4页
扩展元数据——推荐_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论