6 c# expression expression-trees
我已经阅读了几篇关于表达式树的文章和几篇stackoverflow.com帖子.它让我的大脑明白了.
问题:
1)与DOM(文档对象模型)一样,它是逻辑的内存表示吗?
2)有人解释说这是一种将可执行代码转换为数据的机制,使用它我们可以生成代表代码的数据结构.
是否意味着,表达式树用于设计用户定义的模式?
3)大多数示例将表达式树与Func<>委托或其他委托一起显示,因此使用委托和其他编程构造不能实现与表达式服务相同的事情.
初学者可以理解的解释非常感谢.
eld*_*rge 16
表达式树表示单个表达式的语法树.
树的每个节点表示一些常量,对象成员引用或操作.
例如,对于表达式,2 + 3 我们可以构建和表达树:
Expression.MakeBinary(
ExpressionType.Add,
Expression.Constant(2),
Expression.Constant(3));
Run Code Online (Sandbox Code Playgroud)
这些树中最重要的是Expression,它允许以可读的形式编写表达式,提醒签名匹配TDelegate的lambda函数.这是前任
Expression<Func<int>> sum = () => 2 + 3; // much nicer, eh?
Run Code Online (Sandbox Code Playgroud)
但Expression不是委托,因为它无法直接执行.
相反,它可以遍历,例如使用visitor对象来构建一些可执行表示.示例可以是使用CompiledQuery.Compile()等通过LINQ查询构建的Expression.Compile()或SQL查询的委托构建.
表达式树的另一个有用的应用是使用它们来表示否则需要使用Reflection的对象的成员.Reflection使用字符串表示成员名称,并且在编译时不进行检查.检查表达式树,因此可以减少一些错误.
PropertyInfo prop1 = typeof(MyClass).GetProperty("Value");
Expression<Func<MyClass, int>> expr = mc => mc.Value;
PropertyInfo prop2 = (mc.Body as MemberExpression).Member as PropertyInfo;
Run Code Online (Sandbox Code Playgroud)