C# 数据校验之特性的使用

 在日常开发中,想必都见过这样的代码    if a=='' ...;if b=='' ...; 代码冗余且可观赏性非常差;有没有什么方法来解决这个问题呢?可以尝试下使用特性(Attribute)。

对于特性不了解的话,可以去稍微百度下,也是很简单。.

这里主要做的还是基于实体对象的验证;下面来分析下代码

实现功能:

  • 使用特性对数字和邮箱进行验证

开发环境:

开发工具:Visual Studio 2013

.NET Framework版本:4.5

  1. 创建一个抽象特性类,继承自Attribute,里面只要创建一个验证的抽象方法即可,具体实现让子类取做

     public abstract class BaseAttribute : Attribute    {        public abstract string Validate(object value);    }
  2. 分别创建一个控制数字范围以及邮箱验证的特性类,继承自BaseAttribute,然后实现验证函数

     /// <summary>    /// 数值验证    /// </summary>    public class RangeAttribute : BaseAttribute    {        private readonly int _min, _max;        public RangeAttribute(int min, int max)        {            this._min = min;            this._max = max;        }        public override string Validate(object value)        {            try            {                int _value = Convert.ToInt32(value);                if (_value < _min || _value > _max)                {                    return string.Format("验证失败:数值应处于{0}和{1}之间", _min, _max);                }            }            catch (Exception ex)            {                return "验证异常:" + ex.Message;            }            return "";        }    }
        /// <summary>    /// 邮箱验证    /// </summary>    public class MailAttribute : BaseAttribute    {        public override string Validate(object value)        {            try            {                string _value = Convert.ToString(value);                if (!Regex.IsMatch(_value, "^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$"))                {                    return "验证失败:请输入正确的邮箱地址";                }            }            catch (Exception ex)            {
                    return "验证异常:" + ex.Message;            }            return "";        }    }
  3. 创建一个实体类。在字段上加上自定义的特性

      public class Model    {        public string Name { get; set; }        [Range(18, 28)]        public int Age { get; set; }        [Mail]        public string mail { get; set; }    }
  4. 创建一个扩展类,并对类实现一个扩展方法(不用扩展方法也可以,只是这样看着更简洁)

      /// <summary>    /// 扩展类    /// </summary>    public static class ValidateEx    {        /// <summary>        /// 实体扩展方法        /// 验证方法        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="model"></param>        /// <returns></returns>        public static string Validate<T>(this T model) where T : class        {            string msg = null;
                Type type = model.GetType();
                var properties = type.GetProperties();            foreach (var prop in properties)            {                if (prop.IsDefined(typeof(BaseAttribute), true))                {                    var attributes = prop.GetCustomAttributes(typeof(BaseAttribute), true);                    foreach (BaseAttribute attr in attributes)                    {                        msg += attr.Validate(prop.GetValue(model)) + "\r\n";                    }                }            }            return msg;        }    }
  5. 最后写个简单代码看下效果

       private void button1_Click(object sender, EventArgs e)        {            Model model = new Model            {                Name = txt_name.Text,                Age = int.Parse(txt_age.Text),                mail = txt_mail.Text            };            string msg = model.Validate();
                if (!string.IsNullOrWhiteSpace(msg))            {                MessageBox.Show(msg);            }            else            {                MessageBox.Show("验证通过");            }        }

实现效果:

C# 数据校验之特性的使用