|
|
@@ -0,0 +1,45 @@
|
|
|
+using System.Linq.Expressions;
|
|
|
+
|
|
|
+namespace BlazorEditForms.Binding;
|
|
|
+
|
|
|
+public static class ExpressionBuilder
|
|
|
+{
|
|
|
+ public static Expression<Func<TProperty>> CreateGetter<TProperty>(MemberExpression mex)
|
|
|
+ {
|
|
|
+ return Expression.Lambda<Func<TProperty>>(mex);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static Expression<Action<TProperty>> CreateSetter<TProperty>(MemberExpression mex)
|
|
|
+ {
|
|
|
+ var valueParameter = Expression.Parameter(typeof(TProperty), "value");
|
|
|
+ var assign = Expression.Assign(mex, valueParameter);
|
|
|
+ return Expression.Lambda<Action<TProperty>>(assign, valueParameter);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static Expression ReplaceParameter(Expression originalExpression, ParameterExpression parameter, Expression replacement)
|
|
|
+ {
|
|
|
+ return new ParameterReplacer(parameter, replacement).Visit(originalExpression);
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// This visitor replaces a specific function parameter with an actual value given as another
|
|
|
+ /// expression.
|
|
|
+ /// </summary>
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|