LINQ Expression tree节点

在向大家详细介绍创建LINQ Expression tree节点之前,首先让大家了解下节点该如何创建,然后全面介绍。

创建LINQ Expression tree节点

当了解LINQ Expression tree的概念后,就可以来讨论一下这棵树里面的节点该如何创建。LINQ Expression tree节点一般是通过System.Linq.Expression.Expression这个类上的工厂方法来创建的。包括以下的一些方法:

  1. Add : BinaryExpression
  2. AddChecked : BinaryExpression
  3. And : BinaryExpression
  4. AndAlso : BinaryExpression
  5. ArrayIndex : BinaryExpression
  6. ArrayLength : UnaryExpression
  7. Call : MethodCallExpression
  8. Coalesce : BinaryExpression
  9. Condition : ConditionalExpression
  10. Constant : ConstantExpression
  11. Convert : UnaryExpression
  12. ConvertChecked : UnaryExpression
  13. Divide : BinaryExpression
  14. Equal : BinaryExpression
  15. ExclusiveOr : BinaryExpression
  16. Field : MemberExpression
  17. GreaterThan : BinaryExpression
  18. GreaterThanOrEqual : BinaryExpression
  19. Invoke : InvocationExpression
  20. Lambda : Expression<TDelegate>
  21. LeftShift : BinaryExpression
  22. LessThan : BinaryExpression
  23. LessThanOrEqual : BinaryExpression
  24. ListInit : ListInitExpression
  25. MakeBinary : BinaryExpression
  26. MakeMemberAccess : MemberExpression
  27. MakeUnary : UnaryExpression
  28. MemberInit : MemberInitExpression
  29. Modulo : BinaryExpression
  30. Multiply : BinaryExpression
  31. MultiplyChecked : BinaryExpression
  32. Negate : UnaryExpression
  33. NegateChecked : UnaryExpression
  34. New : NewExpression
  35. NewArrayBounds : NewArrayExpression
  36. NewArrayInit : NewArrayExpression
  37. Not : UnaryExpression
  38. NotEqual : BinaryExpression
  39. Or : BinaryExpression
  40. OrElse : BinaryExpression
  41. Parameter : ParameterExpression
  42. Power : BinaryExpression
  43. Property : MemberExpression
  44. PropertyOrField : MemberExpression
  45. Quote : UnaryExpression
  46. RightShift : BinaryExpression
  47. Subtract : BinaryExpression
  48. SubtractChecked : BinaryExpression
  49. TypeAs : UnaryExpression
  50. TypeIs : TypeBinaryExpression
  51. UnaryPlus : UnaryExpression

上述列表中每个名字其实对应着一组重载,参数不同,但返回值的类型是一样的。这些工厂方法所生成的表达式的意义应该说还是很直观的,就不特别介绍了。经常跟编译器打交道的话应该对这些名字尤其熟悉。

这些工厂方法对应的类的层次结构是:

  1. System.Object
  2. System.Linq.Expressions.Expression
  3. System.Linq.Expressions.BinaryExpression
  4. System.Linq.Expressions.ConditionalExpression
  5. System.Linq.Expressions.ConstantExpression
  6. System.Linq.Expressions.InvocationExpression
  7. System.Linq.Expressions.LambdaExpression
  8. System.Linq.Expressions.Expression<TDelegate>
  9. System.Linq.Expressions.MemberExpression
  10. System.Linq.Expressions.MethodCallExpression
  11. System.Linq.Expressions.NewExpression
  12. System.Linq.Expressions.NewArrayExpression
  13. System.Linq.Expressions.MemberInitExpression
  14. System.Linq.Expressions.ListInitExpression
  15. System.Linq.Expressions.ParameterExpression
  16. System.Linq.Expressions.TypeBinaryExpression
  17. System.Linq.Expressions.UnaryExpression

观察可得知,LINQ Expression tree节点中的类只能用于表现表达式,而无法表现“更大”的语法结构,例如赋值表达式、一般语句等。这是LINQ v1的一个重要限制,也是为什么C# 3.0的规范里明确提到一个能赋值给Expressin类型的lambda表达式的方法体只能是一个表达式,而不能是一个代码块——代码块无法通过LINQ v1里的Expression tree表示。同时也值得注意的是,LINQ Expression tree本质上是一棵静态类型的树——所有节点所表示的类型都能够在编译时确定。

posted @ 2012-05-31 19:03  Peter.Luo  阅读(688)  评论(0编辑  收藏  举报