using System.ComponentModel; using System.Linq.Expressions; using System.Reflection; namespace BlazorEditForms.Binding; public static class PropertyBinding { public static PropertyBinding Create(Expression> prop) { if (prop.Body is not MemberExpression memberExpression) { throw new Exception($"Expected expression Body to be a member expression, but got {prop.Body.GetType()}"); } return new PropertyBinding(memberExpression); } } public class PropertyBinding : IBinding, IBindingMetadata, IBindingValue, IMemberExpressionBinding { private readonly Func _getter; private readonly Action _setter; public Expression> Expression { get; } public string DisplayName { get; } public PropertyBinding(MemberExpression memberExpression) { Expression = ExpressionBuilder.CreateGetter(memberExpression); _getter = Expression.Compile(); _setter = ExpressionBuilder.CreateSetter(memberExpression).Compile(); var displayAttr = memberExpression.Member.GetCustomAttributes().FirstOrDefault(); DisplayName = displayAttr?.DisplayName ?? ""; } public TProperty Get() => _getter(); public void Set(TProperty value) => _setter(value); }