C# 使用特性验证实体对象属性
2019-06-23 23:37
24179 人阅读
验证结果实体对象
/// <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();
}如果验证信息非常多,使用特性可以使代码非常简单,共用性非常强。
和博主交个朋友吧