.net 手写实现一个简单实体数据验证

Posted 碌云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.net 手写实现一个简单实体数据验证相关的知识,希望对你有一定的参考价值。

源于一次面试中的面试题,代码如下所示:

 

        public class Product
        {
            public string Name { get; set; }
            public string Description { get; set; }

            public void Validate1()
            {
                if (string.IsNullOrEmpty(this.Name))
                {
                    throw new Exception("请输入名称");
                }
                if (string.IsNullOrEmpty(this.Description))
                {
                    throw new Exception("产品描述不能为空");
                }
            }

            public void Validate2()
            {
                this.Require(x => x.Name, "请输入名称");
                this.Require(x => x.Description, "产品描述不能为空");
            }
        }

要求就是实现这个Require的方法来达到和Validate1方法一样的效果。

 

方法一,Func实现:

            private void Require(Func<Product, string> p, string v)
            {
                string value = p(this);
                //也可以:string value = p.Invoke(this);
                if (string.IsNullOrEmpty(value))
                {
                    throw new Exception(v);
                }
            }

 

 

 

 

方法二,Expression<Func>实现:

            private void Require(Expression<Func<Product, string>> p, string v)
            {
                string value = p.Compile()(this);
                if (string.IsNullOrEmpty(value))
                {
                    throw new Exception(v);
                }
            }

 

 

 

 这个题目算是完成了,其实我原本也不会这样玩的,多亏了QQ群867095512里的大佬啊[滑稽]

 

当然话说回来,实体验证这种东西虽然自己造轮子能提升代码能力,不过还是建议用业内成熟的轮子,比如mvc自带的模型验证或者FluentValidation框架这种轮子。

以上是关于.net 手写实现一个简单实体数据验证的主要内容,如果未能解决你的问题,请参考以下文章

如何将 ASP.NET Core 身份链接到另一个实体?

Go组件学习——手写连接池并没有那么简单

.NET6之MiniAPI(二十):实体验证FluentValidation

代码片段 - Golang 实现简单的 Web 服务器

实体类的动态生成

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段