PropertyBinding.cs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. using System.ComponentModel;
  2. using System.Linq.Expressions;
  3. using System.Reflection;
  4. namespace BlazorEditForms.Binding;
  5. public static class PropertyBinding
  6. {
  7. public static PropertyBinding<TProperty> Create<TProperty>(Expression<Func<TProperty>> prop)
  8. {
  9. if (prop.Body is not MemberExpression memberExpression)
  10. {
  11. throw new Exception($"Expected expression Body to be a member expression, but got {prop.Body.GetType()}");
  12. }
  13. return new PropertyBinding<TProperty>(memberExpression);
  14. }
  15. }
  16. public class PropertyBinding<TProperty> : IBinding<TProperty>, IBindingMetadata, IBindingValue<TProperty>, IMemberExpressionBinding<TProperty>
  17. {
  18. private readonly Func<TProperty> _getter;
  19. private readonly Action<TProperty> _setter;
  20. public Expression<Func<TProperty>> Expression { get; }
  21. public string DisplayName { get; }
  22. public PropertyBinding(MemberExpression memberExpression)
  23. {
  24. Expression = ExpressionBuilder.CreateGetter<TProperty>(memberExpression);
  25. _getter = Expression.Compile();
  26. _setter = ExpressionBuilder.CreateSetter<TProperty>(memberExpression).Compile();
  27. var displayAttr = memberExpression.Member.GetCustomAttributes<DisplayNameAttribute>().FirstOrDefault();
  28. DisplayName = displayAttr?.DisplayName ?? "<Unknown>";
  29. }
  30. public TProperty Get() => _getter();
  31. public void Set(TProperty value) => _setter(value);
  32. }