如果实体属性字段过多,几十,上百个,如果我们每个字段都去判断的话很麻,代码量很大,我们可以采用特性加枚举进行验证:
1、创建一个AbstractAttribute 类
/// <summary>
/// AbstractAttribute 的摘要说明
/// </summary>
public abstract class AbstractAttribute : Attribute
{
/// <summary>
/// 验证失败信息
/// </summary>
public string ErrorMessage { get; set; }
/// <summary>
/// 验证方法
/// </summary>
/// <param name="oValue"></param>
/// <returns></returns>
public abstract string Validate(object oValue);
}
2、创建正则表达式RegexAttribute、必填RequiredAttribute、长度StringLengthAttribute验证类继承AbstractAttribute 类
/// <summary>
/// RegexAttribute 的摘要说明
/// </summary>
public class RegexAttribute: AbstractAttribute
{
/// <summary>
/// 验证正则表达式
/// </summary>
public string RegexText;
public override string Validate(object oValue)
{
string ErrorMessage = string.Empty;
var regex = new Regex(RegexText);
if (!regex.Match(oValue.ToString()).Success)
{
ErrorMessage = base.ErrorMessage;
}
return ErrorMessage;
}
}
/// <summary>
/// RequiredAttribute 的摘要说明
/// </summary>
public class RequiredAttribute: AbstractAttribute
{
public override string Validate(object oValue)
{
string ErrorMessage = string.Empty;
bool result= oValue != null
&& !string.IsNullOrWhiteSpace(oValue.ToString());
if (!result)
{
ErrorMessage = base.ErrorMessage;
}
return ErrorMessage;
}
}
/// <summary>
/// StringLengthAttribute 的摘要说明
/// </summary>
public class StringLengthAttribute : AbstractAttribute
{
/// <summary>
/// 验证最小度
/// </summary>
public int Min { get; set; }
/// <summary>
/// 验证最大长度
/// </summary>
public int Max { get; set; }
public override string Validate(object oValue)
{
string ErrorMessage = string.Empty;
int oValueLen = oValue == null ? 0 : oValue.ToString().Length;
bool result = (oValueLen >= Min && oValueLen <= Max);
if (!result)
{
ErrorMessage = base.ErrorMessage;
}
return ErrorMessage;
}
}
定义规则,创建实体,如下图:
上面的的实体类属性有100多个,定义好后我们就可以写一个通用的验证方法,如下图所示:
/// <summary>
/// 验证数据是否错误
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <returns></returns>
public static string Validate<T>(this T t)
{
string ErrorMsg = string.Empty;
Type type = t.GetType();
//获取所有属性
PropertyInfo[] propertyInfos = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
foreach (var propertyInfo in propertyInfos)
{
if (propertyInfo.IsDefined(typeof(AbstractAttribute),true))//如果属性上有定义该属性,此步没有构造出实例
{
//获取属性值
object oValue = propertyInfo.GetValue(t,null);
//获取属性上的自定义特性
AbstractAttribute[] remarkAttribute = (AbstractAttribute[])propertyInfo.GetCustomAttributes(typeof(AbstractAttribute),true);
foreach (var item in remarkAttribute)
{
ErrorMsg = item.Validate(oValue);
if (!ErrorMsg.IsEmpty())
{
return ErrorMsg;
}
}
}
}
return ErrorMsg;
}
方法完成,验证实体信息如下:
如果还需要加其他验证,同样可以自己扩展特性验证。。。。
收工,又是愉快的一天!!!,准备收拾回家。