using System.Linq.Expressions; namespace BlazorEditForms.Binding; public static class ExpressionBuilder { public static Expression> CreateGetter(MemberExpression mex) { return Expression.Lambda>(mex); } public static Expression> CreateSetter(MemberExpression mex) { var valueParameter = Expression.Parameter(typeof(TProperty), "value"); var assign = Expression.Assign(mex, valueParameter); return Expression.Lambda>(assign, valueParameter); } public static Expression ReplaceParameter(Expression originalExpression, ParameterExpression parameter, Expression replacement) { return new ParameterReplacer(parameter, replacement).Visit(originalExpression); } /// /// This visitor replaces a specific function parameter with an actual value given as another /// expression. /// public class ParameterReplacer : ExpressionVisitor { private readonly ParameterExpression _parameter; private readonly Expression _replacement; public ParameterReplacer(ParameterExpression parameter, Expression replacement) { _parameter = parameter; _replacement = replacement; } protected override Expression VisitParameter(ParameterExpression node) { // Replace the parameter with the provided expression return node == _parameter ? _replacement : base.VisitParameter(node); } } }