ExpressionBuilder.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. using System.Linq.Expressions;
  2. namespace BlazorEditForms.Binding;
  3. public static class ExpressionBuilder
  4. {
  5. public static Expression<Func<TProperty>> CreateGetter<TProperty>(MemberExpression mex)
  6. {
  7. return Expression.Lambda<Func<TProperty>>(mex);
  8. }
  9. public static Expression<Action<TProperty>> CreateSetter<TProperty>(MemberExpression mex)
  10. {
  11. var valueParameter = Expression.Parameter(typeof(TProperty), "value");
  12. var assign = Expression.Assign(mex, valueParameter);
  13. return Expression.Lambda<Action<TProperty>>(assign, valueParameter);
  14. }
  15. public static Expression ReplaceParameter(Expression originalExpression, ParameterExpression parameter, Expression replacement)
  16. {
  17. return new ParameterReplacer(parameter, replacement).Visit(originalExpression);
  18. }
  19. /// <summary>
  20. /// This visitor replaces a specific function parameter with an actual value given as another
  21. /// expression.
  22. /// </summary>
  23. public class ParameterReplacer : ExpressionVisitor
  24. {
  25. private readonly ParameterExpression _parameter;
  26. private readonly Expression _replacement;
  27. public ParameterReplacer(ParameterExpression parameter, Expression replacement)
  28. {
  29. _parameter = parameter;
  30. _replacement = replacement;
  31. }
  32. protected override Expression VisitParameter(ParameterExpression node)
  33. {
  34. // Replace the parameter with the provided expression
  35. return node == _parameter ? _replacement : base.VisitParameter(node);
  36. }
  37. }
  38. }