using System; namespace RosettaUI { public static class PropertyOrFieldMinMaxBinder { public static IBinder Create(IBinder binder, string propertyOrFieldName) { var valueType = binder.GetMinMaxValueType(); var memberType = TypeUtility.GetPropertyOrFieldType(valueType, propertyOrFieldName); var binderType = typeof(PropertyOrFieldMinMaxBinder<,>).MakeGenericType(valueType, memberType); return (IBinder) Activator.CreateInstance(binderType, binder, propertyOrFieldName); } } public class PropertyOrFieldMinMaxBinder : ChildBinder, MinMax> { private readonly Func _childGetter; private readonly Func _childSetter; public PropertyOrFieldMinMaxBinder(IBinder> parentBinder, string propertyOrFieldName) : base(parentBinder) { (_childGetter, _childSetter) = PropertyOrFieldGetterSetter.GetGetterSetter(propertyOrFieldName); } protected override MinMax GetFromParent(MinMax parent) { var (min, max) = parent; return MinMax.Create(_childGetter(min), _childGetter(max)); } protected override MinMax SetToParent(MinMax parent, MinMax value) { var (min, max) = parent; var (valueMin, valueMax) = value; min = _childSetter(min, valueMin); max = _childSetter(max, valueMax); return MinMax.Create(min, max); } } }