ExpressionExtensions.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Reflection;
  6. using System.Text;
  7. namespace Ant.Extensions
  8. {
  9. internal static class ExpressionExtensions
  10. {
  11. public static BinaryExpression Assign(MemberInfo propertyOrField, Expression instance, Expression value)
  12. {
  13. PropertyInfo propertyInfo = propertyOrField as PropertyInfo;
  14. if (propertyInfo != null)
  15. {
  16. var pro = Expression.Property(instance, propertyInfo);
  17. var setValue = Expression.Assign(pro, value);
  18. return setValue;
  19. }
  20. FieldInfo fieldInfo = propertyOrField as FieldInfo;
  21. if (fieldInfo != null)
  22. {
  23. var field = Expression.Field(instance, fieldInfo);
  24. var setValue = Expression.Assign(field, value);
  25. return setValue;
  26. }
  27. throw new ArgumentException();
  28. }
  29. public static bool IsDerivedFromParameter(this MemberExpression exp)
  30. {
  31. ParameterExpression p;
  32. return IsDerivedFromParameter(exp, out p);
  33. }
  34. public static bool IsDerivedFromParameter(this MemberExpression exp, out ParameterExpression p)
  35. {
  36. Expression prevExp = exp.Expression;
  37. MemberExpression memberExp = prevExp as MemberExpression;
  38. while (memberExp != null)
  39. {
  40. prevExp = memberExp.Expression;
  41. memberExp = prevExp as MemberExpression;
  42. }
  43. p = prevExp as ParameterExpression;
  44. if (p != null)
  45. return true;
  46. else
  47. return false;
  48. }
  49. public static Expression StripQuotes(this Expression exp)
  50. {
  51. while (exp.NodeType == ExpressionType.Quote)
  52. {
  53. exp = ((UnaryExpression)exp).Operand;
  54. }
  55. return exp;
  56. }
  57. public static Stack<MemberExpression> Reverse(this MemberExpression exp)
  58. {
  59. var stack = new Stack<MemberExpression>();
  60. stack.Push(exp);
  61. while ((exp = exp.Expression as MemberExpression) != null)
  62. {
  63. stack.Push(exp);
  64. }
  65. return stack;
  66. }
  67. }
  68. }