源于一次面试中的面试题,代码如下所示:
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.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框架这种轮子。
原文地址:https://www.cnblogs.com/cluyun/p/11588275.html
时间: 2024-10-05 00:32:35