C# 使用特性验证实体对象属性
2019-06-23 23:37
18712 人阅读
分类:
验证结果实体对象
/// <summary> /// 验证属性返回实体 /// </summary> public class BaseAttributeDto { /// <summary> /// true:验证成功 /// false:验证失败 /// </summary> public bool Result { get; set; } /// <summary> /// 验证失败错误信息 /// </summary> public string ErrorMsg { get; set; } }
属性验证抽象类
/// <summary> /// 属性验证抽象类 /// </summary> public abstract class AbstractCusAttribute : Attribute { /// <summary> /// 验证失败信息 /// </summary> public string ErrorMsg { get; set; } /// <summary> /// 验证方法 /// </summary> /// <param name="oValue"></param> /// <returns></returns> public abstract BaseAttributeDto Validate(object oValue); }
验证属性长度特性
/// <summary> /// 验证属性长度 /// </summary> public class CusLengthAttribute : AbstractCusAttribute { public int Min { get; set; } public int Max { get; set; } /// <summary> /// 验证是否为空 /// </summary> /// <param name="oValue"></param> /// <returns></returns> public override BaseAttributeDto Validate(object oValue) { var result = new BaseAttributeDto(); int oValueLen = oValue == null ? 0 : oValue.ToString().Length; result.Result = (oValueLen >= Min && oValueLen <= Max); if (!result.Result) { result.ErrorMsg = base.ErrorMsg; } return result; } }
验证属性是否必填特性
/// <summary> /// 验证属性是否必填 /// </summary> public class CusRequiredAttribute : AbstractCusAttribute { /// <summary> /// 验证是否为空 /// </summary> /// <param name="oValue"></param> /// <returns></returns> public override BaseAttributeDto Validate(object oValue) { var result = new BaseAttributeDto(); result.Result = oValue != null && !string.IsNullOrWhiteSpace(oValue.ToString()); if (!result.Result) { result.ErrorMsg = base.ErrorMsg; } return result; } }
实体属性验证
public static class ModelPropertyAttribute { public static BaseAttributeDto Validate<T>(this T dto) { var result = new BaseAttributeDto(); Type type = dto.GetType(); //获取属性信息 PropertyInfo[] properties = type.GetProperties(); foreach (var prop in properties) { //检查属性是否含有指定特性 if (prop.IsDefined(typeof(AbstractCusAttribute), true)) { //获取属性值 object oValue = prop.GetValue(dto); //获取属性上的自定义特性 AbstractCusAttribute remarkAttribute = (AbstractCusAttribute)prop.GetCustomAttribute(typeof(AbstractCusAttribute)); result = remarkAttribute.Validate(oValue); //存在验证失败的直接退出循环 if (!result.Status) { break; } } } return result; } }
开始使用特性
public class People { [CusRequired(ErrorMsg = "请输入名称")] public string Name { get; set; } [CusLength(Min = 2, Max = 10, ErrorMsg = "用户编号长度为2到10")] public string UserNo { get; set; } } static void Main(string[] args) { People people = new People() { Name = "13", UserNo = "" }; var result = people.Validate(); if (!result.Result) { //验证失败信息 var msg = result.ErrorMsg; return; } //验证成功,继续自己业务逻辑 Console.WriteLine(""); Console.ReadKey(); }
如果验证信息非常多,使用特性可以使代码非常简单,共用性非常强。
和博主交个朋友吧