干货表达式树解析框架

上传人:tia****nde 文档编号:37019277 上传时间:2018-04-05 格式:DOC 页数:15 大小:176KB
返回 下载 相关 举报
干货表达式树解析框架_第1页
第1页 / 共15页
干货表达式树解析框架_第2页
第2页 / 共15页
干货表达式树解析框架_第3页
第3页 / 共15页
干货表达式树解析框架_第4页
第4页 / 共15页
干货表达式树解析框架_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《干货表达式树解析框架》由会员分享,可在线阅读,更多相关《干货表达式树解析框架(15页珍藏版)》请在金锄头文库上搜索。

1、关于我和表达式树关于我和表达式树其实我也没有深入了解表达式树一些内在实现的原理,所以具体来说它到底是个什么东 西我也不是很清楚,我的理解只是他是可以将部分委托构造成对象,方便我们对他进行解析; 虽然我没有完全搞懂表达式树,但这并不妨碍我使用它(如果以后有时间,我想我会更深入的 去和它接触一下)Lamda + 表达式树的性能瓶颈表达式树的性能瓶颈对于 Lamda 表达式树我的感觉是又爱又恨书写和阅读方面,无疑是非常成功的,他大大的减少了书写难度,增加了可读性但另一方面,在程序的性能上又是如此的糟糕来看下面一个栗子:static void Main() Where1(u = u.Name = “1

2、“);Where2(u = u.Name = “1“); public static void Where1(Expression expr) public static void Where2(Func expr) 栗子中的 Where1 和 Where2 两个方法,唯一的不同,一个是委托,一个是表达式树同样运行 Where1 和 Where2 一万次,Where2 是是 0ms,Where1 是是 57ms也就是说从 Func转为转为 Expression一万一万 次需要次需要 57ms这对于我这样一个追求性能的人来说,实在是有点难受!到不至于不能接受,只有有点难受但从另一方面我也在考虑,

3、为什么像这样的为什么像这样的 lamda 不能直接预编译成不能直接预编译成 Expression 呢呢?期待微软的优化吧伪框架伪框架为什么我的标题中的框架为带有引号?因为我觉得这其实是一个伪框架但他确实能帮助我们更好的解析 Expression 对象,或许应该把他称之为解决方案或是 别的不过管他呢!能用就行了你应该了解的你应该了解的 Expression刚才说了虽然我也没有完全搞懂,但是有些东西还是应该知道的 比如:以 Expression 作为基类的子类一 共有多少个 他们分别是干什么的 第一个问题比较简单1. 现在在 vs 中敲下 System.Linq.Expressions. Expr

4、ession 2. 然后按 F1 3. 如果顺利的话,你现在已经打开了“MSDN“ 4. 如果没有的话就手动点一下吧 5. 然后滚动到屏幕最下面 好了这里看到的就是所有public的子类(其实没有公开的还有更多)至于他们分别是干什么用的,每一个都有自己不同的用法,这里不可能一一说明了,下面下面 的内容也只会涉及到一部分的内容也只会涉及到一部分,其他就要自己慢慢研究了其他就要自己慢慢研究了举个栗子:BinaryExpression -表示包含二元运算符的表达式表示包含二元运算符的表达式最基础的用法就是它的三个属性 Left ,Right ,NodeType Left 获取二元运算的左操作数。ww

5、w.ipb.cc Right 获取二元运算的右操作数。 NodeType 获取此 Expression 的节点类型。 如 it = it.Name = “blqw“就是一个 BinaryExpressionLeft = it.Name Right = “blqw“ NodeType = Equals大概就是这么一个意思吧效果预览效果预览框架结构框架结构嗯.允许我还是叫他框架吧,毕竟听上去比较高端大气上档次啊暂时是这样Parsers 文件夹里面的是具体对应 每一种表达式树每一种表达式树的解析的具体实 现 ExpressionParser 表达 式树解析器抽象基类,实现IExpressionPar

6、ser ExpressionTypeCode 枚举, 枚举了所有的类型的表达式树 IExpressionParser 表达 式树解析器接口 Parser 调用 解析器的静态对象,也可以看作入 口或工厂,根据表达式树类型调用 具体类 ParserArgs 解析 器参数,在解析表达式树的方法中 保持传递,可以保存解析中所使用 的参数和保存解析结果 代码代码public class ParserArgspublic ParserArgs()Builder = new StringBuilder();public StringBuilder Builder get; private set; pub

7、lic IList Forms get; set; public readonly string FormsAlias = “it“, “A“, “B“, “C“, “D“, “E“ ;IExpressionParser/ 表达式树解析接口/ public interface IExpressionParservoid Select(Expression expr, ParserArgs args);void Where(Expression expr, ParserArgs args);void GroupBy(Expression expr, ParserArgs args);void H

8、aving(Expression expr, ParserArgs args);void OrderBy(Expression expr, ParserArgs args);void Object(Expression expr, ParserArgs args);/ 表达式树解析抽象泛型类/ public abstract class ExpressionParser : IExpressionParserwhere T : Expressionpublic abstract void Select(T expr, ParserArgs args);public abstract void

9、Where(T expr, ParserArgs args);public abstract void GroupBy(T expr, ParserArgs args);public abstract void Having(T expr, ParserArgs args);public abstract void OrderBy(T expr, ParserArgs args);public abstract void Object(T expr, ParserArgs args);public void Select(Expression expr, ParserArgs args)Sel

10、ect(T)expr, args);public void Where(Expression expr, ParserArgs args)Where(T)expr, args);public void GroupBy(Expression expr, ParserArgs args)GroupBy(T)expr, args);public void Having(Expression expr, ParserArgs args)Having(T)expr, args);public void OrderBy(Expression expr, ParserArgs args)OrderBy(T)

11、expr, args);public void Object(Expression expr, ParserArgs args)Object(T)expr, args);/ 表达式类型枚举/ public enum ExpressionTypeCode/ 未知类型表达式/ Unknown = 0,/ 空表达式 null/ Null = 1,/ 表示包含二元运算符的表达式。/ BinaryExpression = 2,/ 表示一个包含可在其中定义变量的表达式序列的块。/ BlockExpression = 3,/ 表示包含条件运算符的表达式。/ ConditionalExpression = 4

12、,/ 表示具有常量值的表达式。/ ConstantExpression = 5,/ 发出或清除调试信息的序列点。 这允许调试器在调试 时突出显示正确的源代码。/ DebugInfoExpression = 6,/ 表示类型或空表达式的默认值。/ DefaultExpression = 7,/ 表示动态操作。/ DynamicExpression = 8,/ 表示无条件跳转。 这包括 return 语句、break 和 continue 语句以及其他跳转。/ GotoExpression = 9,/ 表示编制属性或数组的索引。/ IndexExpression = 10,/ 表示将委托或 lam

13、bda 表达式应用于参数表达式列表的 表达式。/ InvocationExpression = 11,/ 表示一个标签,可以将该标签放置在任何 Expression 上下文中。 / LabelExpression = 12,/ 描述一个 lambda 表达式。 这将捕获与 .NET 方法体 类似的代码块。/ LambdaExpression = 13,/ 表示包含集合初始值设定项的构造函数调用。/ ListInitExpression = 14,/ 表示无限循环。 可以使用“break”退出它。/ LoopExpression = 15,/ 表示访问字段或属性。/ MemberExpressi

14、on = 16,/ 表示调用构造函数并初始化新对象的一个或多个成员。/ MemberInitExpression = 17,/ 表示对静态方法或实例方法的调用。/ MethodCallExpression = 18,/ 表示创建新数组并可能初始化该新数组的元素。/ NewArrayExpression = 19,/ 表示构造函数调用。/ NewExpression = 20,/ 表示命名的参数表达式。/ ParameterExpression = 21,/ 一个为变量提供运行时读/写权限的表达式。/ RuntimeVariablesExpression = 22,/ 表示一个控制表达式,该表达

15、式通过将控制传递到 SwitchCase 来处理多重选择。/ SwitchExpression = 23,/ 表示 try/catch/finally/fault 块。/ TryExpression = 24,/ 表示表达式和类型之间的操作。/ TypeBinaryExpression = 25,/ 表示包含一元运算符的表达式。/ UnaryExpression = 26,/ 解析器静态对象 / public static class Parserprivate static readonly IExpressionParser Parsers = InitParsers();static IExpressionParser InitParsers()var codes = Enum.GetValues(typeof(ExpressionTypeCode);var parsers = new IExpressionParsercodes.Length;foreach (ExpressionTypeCode code in codes)if (code.ToString().EndsWith(“Expression“)

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 试题/考题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号