当前位置: 首页 > news >正文

网站开发的国内外现状做网站的去哪找私活

网站开发的国内外现状,做网站的去哪找私活,五道口网站建设公司,好看的网站建设公司一、前言 在我们日常开发中Lamba 表达式经常会使用#xff0c;如List.Where(nNameabc) 使用起来非常的方便#xff0c;代码也很简洁#xff0c;总之一个字就是“爽”。在之前我们总是用硬编码的方式去实现一些底层方法#xff0c;比如我要查询用户“abc”是… 一、前言      在我们日常开发中Lamba 表达式经常会使用如List.Where(nNameabc) 使用起来非常的方便代码也很简洁总之一个字就是“爽”。在之前我们总是用硬编码的方式去实现一些底层方法比如我要查询用户“abc”是否存在老的实现方式基本为GetUser(string name) 可能下次我需要按用户登录账号来查询于是又得写一个方法GetUserByLogin(string loginCode)我们认真想一下如果能实现类似于集合查询那样只要写lambda 就能搞定List.Where(nNameabc)List.Where(nLoginCode小A)有了这样的想法那我们也去了解一下lambda 表达式树的背后吧。 二、初识       表达式树关键字“Expressions”我们在官方文档里面可以看到很多介绍具体信息请查看微软官方文档库官方文档里面的信息量比较大有几十个对象的介绍 这里我不建议大家从头到尾的看一遍大致浏览就好了因为信息量太多了。首先我们新建一个控制台程序框架版本选FX4.0以上或者Core 都行引入命名空间 using System.Linq.Expressions; 接下来实现一个简单的功能解析表达式 nn.Nameabc 我们想要的结果是 Nameabc,有了这个目标我们就知道该干嘛了。 定义函数private static string GetLambdaStrT(ExpressionFuncT, bool expression)该函数定义了一个表达式树参数Funcin T,out bool是范型委托该委托表示接收一个T类型参数返回一个bool值。具体代码 private static string GetLambdaStrT(ExpressionFuncT, bool expression){//解析表达式//return new Analysis().AnalysisExpression(expression); return null;}  接下来建立一个用户对象 public class User{public int ID { get; set; }public string Name { get; set; }public int Age { get; set; }public bool States { get; set; }} 再建立好测试代码 //ExpressionFuncT, bool lambda n n.Name abc;Console.WriteLine(lambda n n.Name \abc\ );var a GetLambdaStrUser(n n.Name abc);Console.WriteLine(result a);Console.Write(Environment.NewLine);Console.ReadKey(); 先不管那么多我们调试进去看看表达式长啥样   这样看比较清真就是一个lambda表达式我们展开看看对象明细   看到这里我们是不是能想起点什么了这其实就是一颗二叉树显示的层次为根节点左子节点右子节点依次循环。有了这个认知我们立马能想到可以使用递归来遍历节点了。      于是我来了解表达式对象“Expression”有哪些属性和方法 看到这里有点困惑了刚刚我们明明看到有Left、Right 属性但这里却没有感觉好坑呀。没有左右节点我们根本不知道怎么去递归查找子节点呢。于是又去看官方介绍文档了然后再仔细看了LambdaExpression 对象这个是抽象类有抽象必定有相关的实现或者提供对外属性仔细一找刚好找到BinaryExpression对象有Left、Right属性同时继承了Expression对象也提供了LambdaExpression 属性这个就是我们要找的对象了可以说是峰回路转了  顺着这个思路我又找到了属性成员和属性值对象MemberExpression、ConstantExpression我们来实现关键代码         private static string GetLambdaStrT(ExpressionFuncT, bool expression)        {            //解析表达式            var body (BinaryExpression)expression.Body;            var r (ConstantExpression)body.Right;            var l (MemberExpression)body.Left;            var value r.Type.IsValueType ? r.Value : ${r.Value};            return ${ l.Member.Name} {Operand(body.NodeType)} {value} ;            // return new Analysis().AnalysisExpression(expression);        } Operand 是操作类型转换代码如下 //操作符转换private string Operand(ExpressionType type){string operand string.Empty;switch (type){case ExpressionType.AndAlso:operand AND;break;case ExpressionType.OrElse:operand OR;break;case ExpressionType.Equal:operand ;break;case ExpressionType.LessThan:operand ;break;case ExpressionType.LessThanOrEqual:operand ;break;case ExpressionType.GreaterThan:operand ;break;case ExpressionType.GreaterThanOrEqual:operand ;break;}return operand;} View Code 有了上面的代码我们已经完成功能了运行结果如下 三、进阶      日常开发中我们遇到的查询条件可能会更加复杂于是我又写了几个复杂得表达式 //ExpressionFuncT, bool lambda n n.states;Console.WriteLine(analysis n n.states );var b GetLambdaStrUser(n n.States);Console.WriteLine(result b);Console.ReadKey();//ExpressionFuncT, bool lambda n n.Name abc n.Age 30 || n.ID 4;Console.WriteLine(lambda n n.Name \abc\ n.Age 30 || n.ID 4);var c GetLambdaStrUser(n n.Name abc (n.Age 30 || n.ID 4) n.ID 1 (n.ID 19 || n.Name 33));Console.WriteLine(result c);Console.Write(Environment.NewLine);Console.ReadKey();  经过我的一番探索和调试终于完成了解析 建议手动去敲一遍代码并调试这中间我遇到了一些坑比如使用了OR条件时需要增加括号这个括号老是没放对位置。 最后贴出全部代码 1、控制台代码 //ExpressionFuncT, bool lambda n n.Name abc;Console.WriteLine(lambda n n.Name \abc\ );var a GetLambdaStrUser(n n.Name abc);Console.WriteLine(result a);Console.Write(Environment.NewLine);Console.ReadKey();//ExpressionFuncT, bool lambda n n.states;Console.WriteLine(analysis n n.states );var b GetLambdaStrUser(n n.States);Console.WriteLine(result b);Console.ReadKey();//ExpressionFuncT, bool lambda n n.Name abc n.Age 30 || n.ID 4;Console.WriteLine(lambda n n.Name \abc\ n.Age 30 || n.ID 4);var c GetLambdaStrUser(n n.Name abc (n.Age 30 || n.ID 4) n.ID 1 (n.ID 19 || n.Name 33));Console.WriteLine(result c);Console.Write(Environment.NewLine);Console.ReadKey(); View Code 2、解析函数 private static string GetLambdaStrT(ExpressionFuncT, bool expression){//解析表达式return new Analysis().AnalysisExpression(expression);} View Code 3、用户对象代码上面已经有了就不重复发了 4、解析对象代码 public class Analysis{private StringBuilder builder new StringBuilder();public string AnalysisExpressionTDelegate(ExpressionTDelegate expression){if (expression.Body is MemberExpression){var m (MemberExpression)expression.Body;var value Convert.ToInt32(!expression.Body.ToString().Contains(!));builder.Append($ ({m.Member.Name}{value}) );return builder.ToString();}var body (BinaryExpression)expression.Body;if (body.NodeType ExpressionType.AndAlso || body.NodeType ExpressionType.OrElse){AnalysisExpressionChild((BinaryExpression)body.Left, body.NodeType);AnalysisExpressionChild((BinaryExpression)body.Right, body.NodeType);}else{var r (ConstantExpression)body.Right;var l (MemberExpression)body.Left;var value r.Type.IsValueType ? r.Value : ${r.Value};builder.Append($ { l.Member.Name} {Operand(body.NodeType)} {value} );}return builder.ToString();}//解析表达式树private void AnalysisExpressionChild(BinaryExpression expression, ExpressionType pType, string brackets ){if (expression.NodeType ! ExpressionType.AndAlso expression.NodeType ! ExpressionType.OrElse){var r (ConstantExpression)expression.Right;var l (MemberExpression)expression.Left;var value r.Type.IsValueType ? r.Value : ${r.Value};builder.Append($ {Operand(pType)} {brackets} { l.Member.Name} {Operand(expression.NodeType)} {value} );}else{if (expression.NodeType ExpressionType.OrElse){brackets ( ;}AnalysisExpressionChild((BinaryExpression)expression.Left, pType, brackets);AnalysisExpressionChild((BinaryExpression)expression.Right, expression.NodeType);if (expression.NodeType ExpressionType.OrElse){builder.Append( ));}}}//操作符转换private string Operand(ExpressionType type){string operand string.Empty;switch (type){case ExpressionType.AndAlso:operand AND;break;case ExpressionType.OrElse:operand OR;break;case ExpressionType.Equal:operand ;break;case ExpressionType.LessThan:operand ;break;case ExpressionType.LessThanOrEqual:operand ;break;case ExpressionType.GreaterThan:operand ;break;case ExpressionType.GreaterThanOrEqual:operand ;break;}return operand;}} View Code  至此表达式树已经完成了解析上面的案例已经能满足常用的需求了若有其他要求我们可以继续改造拓展解析方法。 四、总结       我们在学习技术的时候带着一定的目的去学习往往效率更高又不容易忘记同时要善于思考联系上下文情景。如果你觉得看完后对你有帮助可以给我点赞。   相关代码已经放到GitHub  参考文档 1、微软官方文档库https://docs.microsoft.com/zh-cn/dotnet/api/system.linq.expressions?viewnetcore-2.2 2、腾讯云https://cloud.tencent.com/developer/article/1334993 五、补充      经过继续研究和分析网友的解析方法发现其实微软对表达式解析已经提供的了一个专门类ExpressionVisitor该类实现了对各种表达式操作的解析我们直接继承它 所以我又重写了一个解析类AnalyseExpressionHelper需要修改案例中调用解析方法的代码   private static string GetLambdaStrT(ExpressionFuncT, bool expression){//解析表达式三var heler new AnalyseExpressionHelper();heler.AnalyseExpression(expression);return heler.Result;}   操作符转换函数已经修改为拓展方法 using System.Linq.Expressions;namespace ExpressionTreeDemo {public static class ExpressionExtend{//操作符转换public static string TransferOperand(this ExpressionType type){string operand string.Empty;switch (type){case ExpressionType.AndAlso:operand AND;break;case ExpressionType.OrElse:operand OR;break;case ExpressionType.Equal:operand ;break;case ExpressionType.NotEqual:operand ;break;case ExpressionType.LessThan:operand ;break;case ExpressionType.LessThanOrEqual:operand ;break;case ExpressionType.GreaterThan:operand ;break;case ExpressionType.GreaterThanOrEqual:operand ;break;}return operand;}} } ExpressionExtend   新的表达式解析方法 using System; using System.Text; using System.Linq.Expressions;namespace ExpressionTreeDemo {/// summary/// 表达式解析辅助类/// /summarypublic class AnalyseExpressionHelper : ExpressionVisitor{private StringBuilder express new StringBuilder();public string Result { get { return express.ToString(); } }public void AnalyseExpressionT(ExpressionFuncT, bool expression){Visit(expression.Body);}protected override Expression VisitBinary(BinaryExpression node){if (node.NodeType ExpressionType.OrElse)express.Append(();Visit(node.Left);express.Append($ {node.NodeType.TransferOperand()} );Visit(node.Right);if (node.NodeType ExpressionType.OrElse)express.Append());return node;}protected override Expression VisitConstant(ConstantExpression node){if (node.Type.IsValueType node.Type ! typeof(DateTime)){express.Append(node.Value);}else{express.Append(${node.Value});}return node;}protected override Expression VisitMember(MemberExpression node){express.Append(node.Member.Name);return node;}} } AnalyseExpressionHelper   转载于:https://www.cnblogs.com/heweijian/p/11406715.html
http://www.pierceye.com/news/139759/

相关文章:

  • 民治营销网站专业网站建设价格最优
  • 免费的html网站做柜子喜欢上哪些网站看
  • 网站没备案怎么做加速现代装修风格三室两厅效果图
  • 互助平台网站建设网上商城怎么购物
  • 百度知道山东网站建设建设网站成本预算
  • 人人做免费网站网站建站是 什么
  • 以背景做网站视频为单位网站建设实施方案
  • 简洁大气企业网站模板西安个人做网站
  • 做一个网站需要到哪里做辽宁同鑫建设网站
  • 开发网站监控推荐扬中市建设局网站
  • 手机网站根目录简述一个网站设计的主要步骤
  • 网站改版seo建议网页设计师的能力
  • 网站上线前应该备案吗温州网站建设风格
  • 网站建设书籍免费聊城市东昌府区建设路小学网站
  • 网站标题优化怎么做找人一起做素材网站
  • 如何创建个人网站模板用织梦做模板网站
  • 平台建站建设做网站一定要有营业执照吗
  • 如何把学校网站建设好天猫店铺购买
  • 网站的建设和推广企业网站建设的主要目的是
  • html5 公众号 网站开发工程公司名称
  • 公司做网站那家好网站二维码怎么制作
  • 鼓楼区建设房产和交通局网站网站全屏图片怎么做
  • 外贸订单流失严重番禺网站建设优化推广
  • 做网站送邮箱电商网站建设行情
  • f2c网站建设珠海手机网站建设费用
  • 网站建设的策划书wordpress相册代码
  • 直播网站创做上海网站制作公司哪
  • 如何承接网站建设外包昆明专业网站设计公司
  • 网站做关键词库的作用trellis wordpress
  • 建设一个网站需要哪些硬件设备关键词查询爱站网