关键字:IExtenderProvider 属性扩展 Validator 验证

    最近我的键盘指法长进不少,究其原因是因为我经常输入一些重复的代码。大家都知道,数据保存之前要对它进行验证,我每次都要在保存的事件里写检查某个控件的值是否合法的代码,这些代码基本差不多,每次都输入这些类似的代码,日久天长,我的键盘指法自然就越来越熟了。指法已经练习的差不多了,再输入这些烦人的代码时就失去了原来敲代码的动力,于是就大片大片的拷贝/粘贴,然后再修改,如此又度过一段有趣时光。

是不是做程序员时间长了就会变懒?最近我连这种复制/粘贴的工作也觉得累了,每天都在这样周而复始中睡去,生活总是缺少一点创意。直到有一天在使用ToolTip组件时突然想到,能不能像TooTip组件一样有一个属性设置能执行类似验证的功能呢,于是就有这篇随笔和这个Validator(演示代码下载)组件。

查了一些资料发现原来ToolTip实现了IExtenderProvider接口,关于这个接口Framework SDK文档有说明和实例。这里只对自己在实践过程中遇到的一些问题做点总结并对我写的一个Validator组件做点说明:

1、扩展到其它组件的属性名称由ProvideProperty特性标记定义,如[ProvideProperty("ValidateType",typeof(Control))]。

2、属性的实现方法有点特殊,不是get/set方法,而是以Get+属性名/Set+属性名命名的方法,如GetValidateType/SetValidateType。
   
3IExtenderProviderCanExtend方法用来实现在哪些控件上使用自定义的扩展属性。如要想只在TextBox控件上出现自定义的扩展属性,可用下面方法:

public bool CanExtend(object extendee)
{
    
return (extendee is System.Windows.Forms.TextBox);
}

    下面介绍一下我写的Validator组件,它是我写的一个IExtenderProvider接口实现的例子,功能很简单,只是通过实现ValidateType(验证类型)和ValidateErrorMsg()两个扩展属性,最后由一个公开方法Validate根据ValidateType属性提供和验证类型对控件的Text属性进行验证,验证不通过显示由ValidateErrorMsg属性指定的错误信息并标示出未通过验证的控件。

    我定义了五种验证类型,如下:

/// <summary>
/// 验证类型
/// </summary>

public enum ValidateTypes
{
    
/// <summary>
    
/// 无验证
    
/// </summary>

    None,
   
/// <summary>
    
/// 不能为空
    
/// </summary>

    MustNotEmpty,
   
/// <summary>
    
/// 必须大于0
    
/// </summary>

    MustRightZero,
   
/// <summary>
    
/// 必须大于等于0
    
/// </summary>

    MustRightOrEqualZero,
   
/// <summary>
    
/// 不能等于0
    
/// </summary>

    MustNotEqualZero,
}

    使用时只要在验证的控件上设置ValidateTypeValidateErrorMsg属性,在需要验证的地方执行Validator组件的Validate方法即可。




代码下载