| 12345678910111213141516171819202122232425262728293031323334353637383940 |
- using System.ComponentModel;
- using System.Linq.Expressions;
- using System.Reflection;
- namespace BlazorEditForms.Binding;
- public static class PropertyBinding
- {
- public static PropertyBinding<TProperty> Create<TProperty>(Expression<Func<TProperty>> 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<TProperty>(memberExpression);
- }
- }
- public class PropertyBinding<TProperty> : IBinding<TProperty>, IBindingMetadata, IBindingValue<TProperty>, IMemberExpressionBinding<TProperty>
- {
- private readonly Func<TProperty> _getter;
- private readonly Action<TProperty> _setter;
- public Expression<Func<TProperty>> Expression { get; }
- public string DisplayName { get; }
- public PropertyBinding(MemberExpression memberExpression)
- {
- Expression = ExpressionBuilder.CreateGetter<TProperty>(memberExpression);
- _getter = Expression.Compile();
- _setter = ExpressionBuilder.CreateSetter<TProperty>(memberExpression).Compile();
- var displayAttr = memberExpression.Member.GetCustomAttributes<DisplayNameAttribute>().FirstOrDefault();
- DisplayName = displayAttr?.DisplayName ?? "<Unknown>";
- }
- public TProperty Get() => _getter();
- public void Set(TProperty value) => _setter(value);
- }
|