tnblog
首页
登录

特性扩展实体对象验证、枚举验证值是否正确

132人阅读 2021/5/28 9:58 总访问:6527 评论:0 手机 收藏
分类: asp.net

如果实体属性字段过多,几十,上百个,如果我们每个字段都去判断的话很麻,代码量很大,我们可以采用特性加枚举进行验证:
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;

    }



方法完成,验证实体信息如下:

如果还需要加其他验证,同样可以自己扩展特性验证。。。。
收工,又是愉快的一天!!!,准备收拾回家。

评价
此时幽梦远,不觉到山边!!!
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2020TNBLOG.NET
技术交流:群号677373950
欢迎加群交流技术