tnblog
首页
视频
资源
登录

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

5117人阅读 2021/5/28 9:58 总访问:105145 评论:0 收藏:0 手机
分类: .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;

    }



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

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

评价

Quartz.NET实例动态改变周期调度。misfireCron

Quartz:Java编写的开源的任务调度作业框架 类似Timer之类定时执行的功能,但是更强大Quartz.NET:是把Quartz转成C# NuGet...

.NET Windows服务发布安装卸载监听脚本。服务调试

一、脚本 为方便不用每次都去写安装卸载的脚本1.安装脚本@echooff @echo开始安装【服务】 %SystemRoot%\Microsoft.NET\Fr...

C ??? 问号和2个问号的用法(类型?对象?)

C# ?C# ???:单问号1.定义数据类型可为空。可用于对int,double,bool等无法直接赋值为null的数据类型进行null的赋值如这...

C outref关键字的用法和区别

说说自己对out、ref的认识,面试问到的几率很高哟。out:classProgram { /* *out、ref都是引用传递,传递后使用都会改变...

cVB.net中全角半角转换方法

///&lt;summary&gt; ///转全角的函数(SBCcase) ///&lt;/summary&gt; ///&lt;paramname=&quot;input&quot;&gt;任意字符串...

redis中主从哨兵和集群这三个有什么区别

主从模式:备份数据、负载均衡,一个Master可以有多个Slaves。sentinel(哨兵)发现master挂了后,就会从slave中重新选举一个...

JS监听inputkeydown,有输入法时打字完成后触发事件

在给输入框绑定input或keydown事件时预期效果是有输入法时,输入中文后触发事件,不希望输一个字母就触发一次事件可以用到c...

下划线换行回车空格ASCII码值与对照表

下划线,ASCII码95换行 , ASCII码10回车 , ASCII码13空格 , ASCII码32ASCII码表:Bin(二进制)Oct(八进制)Dec(十进制)Hex(...

docker常用命令删除镜像命令进入容器docker重启命令等

1. docker version查看 Docker 版本信息2. docker info显示 Docker 系统信息,包括镜像,容器数等3. 运行容器第一次使用:d...

多线程Lock锁数据库实现队列

队列其元素以先进先出(Firstin,Firstout,FIFO)的方式来处理的集合。先放入队列中的元素会先读取。队列使用System.Collect...

jsJQuery获取文本的宽高

页面编写:&lt;!DOCTYPEhtml&gt; &lt;html&gt; &lt;head&gt; &lt;metacharset=&quot;UTF-8&quot;/&gt; &lt;title&gt;jQ...

code first执行命令报错,无法将“Enable-Migrations”项识别为 cmdlet函数脚本文件

EF:执行命令报错无法将“Enable-Migrations”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如...

缓存穿透缓存击穿缓存雪崩区别

一、缓存穿透 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存...

微服务分布式架构项目的一点点想法

分布式与微服务的区别:说一点个人理解分布式: 分散压力。 不同功能块之间的通讯少,还是会有不少代码,每一...

文件传输原理与二进制字节字符理解

传输文件原理: 把文件转换成字节数组,通过字节数组传输 然后接收方在把字节数据转换成文件二进制为什么能存储文件 ...
此时幽梦远,不觉到山边!!!
排名
33
文章
20
粉丝
5
评论
4
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术