@@ -89,91 +89,79 @@ public T Value
8989 if ( ! this . IsValid ( value ) )
9090 throw new ArgumentOutOfRangeException ( nameof ( value ) , value , LocalizedStrings . InvalidValue ) ;
9191
92- if ( _hasStep && ! IsStepValid ( value ) )
92+ if ( _hasStep && _hasStep && ! IsValueMatchesStep ( GetValueType ( ) , value , _stepValue , _stepBaseValue ) )
9393 throw new ArgumentOutOfRangeException ( nameof ( value ) , value , LocalizedStrings . InvalidValue ) ;
9494
9595 _value = value ;
9696 NotifyChanged ( ) ;
9797 }
9898 }
9999
100- private bool IsStepValid ( T value )
100+ private static bool IsValueMatchesStep ( Type type , T value , T step , T baseValue )
101101 {
102- if ( ! _hasStep )
103- return true ;
104-
105- var type = GetValueType ( ) ;
106-
107- try
102+ if ( type == typeof ( TimeSpan ) )
108103 {
109- if ( type == typeof ( TimeSpan ) )
110- {
111- var v = value . To < TimeSpan > ( ) ;
112- var b = _stepBaseValue . To < TimeSpan > ( ) ;
113- var s = _stepValue . To < TimeSpan > ( ) ;
104+ var v = value . To < TimeSpan > ( ) ;
105+ var b = baseValue . To < TimeSpan > ( ) ;
106+ var s = step . To < TimeSpan > ( ) ;
114107
115- var diff = v - b ;
108+ var diff = v - b ;
116109
117- if ( diff < TimeSpan . Zero )
118- return false ;
110+ if ( diff < TimeSpan . Zero )
111+ return false ;
119112
120- return diff . Ticks % s . Ticks == 0 ;
121- }
122- else if ( type . IsNumericInteger ( ) )
123- {
124- var v = value . To < long > ( ) ;
125- var b = _stepBaseValue . To < long > ( ) ;
126- var s = _stepValue . To < long > ( ) ;
113+ return diff . Ticks % s . Ticks == 0 ;
114+ }
115+ else if ( type . IsNumericInteger ( ) )
116+ {
117+ var v = value . To < long > ( ) ;
118+ var b = baseValue . To < long > ( ) ;
119+ var s = step . To < long > ( ) ;
127120
128- var diff = v - b ;
121+ var diff = v - b ;
129122
130- if ( diff < 0 )
131- return false ;
123+ if ( diff < 0 )
124+ return false ;
132125
133- return diff % s == 0 ;
134- }
135- else if ( type . IsNumeric ( ) )
136- {
137- var v = value . To < decimal > ( ) ;
138- var b = _stepBaseValue . To < decimal > ( ) ;
139- var s = _stepValue . To < decimal > ( ) ;
126+ return diff % s == 0 ;
127+ }
128+ else if ( type . IsNumeric ( ) )
129+ {
130+ var v = value . To < decimal > ( ) ;
131+ var b = baseValue . To < decimal > ( ) ;
132+ var s = step . To < decimal > ( ) ;
140133
141- var diff = v - b ;
134+ var diff = v - b ;
142135
143- if ( diff < 0 )
144- return false ;
136+ if ( diff < 0 )
137+ return false ;
145138
146- var q = diff / s ;
147- var rq = Math . Round ( q ) ;
139+ var q = diff / s ;
140+ var rq = Math . Round ( q ) ;
148141
149- return ( q - rq ) . Abs ( ) < 1e-10m ;
150- }
151- else if ( type == typeof ( Unit ) )
152- {
153- var v = value . To < Unit > ( ) ;
154- var b = _stepBaseValue . To < Unit > ( ) ;
155- var s = _stepValue . To < Unit > ( ) ;
142+ return ( q - rq ) . Abs ( ) < 1e-10m ;
143+ }
144+ else if ( type == typeof ( Unit ) )
145+ {
146+ var v = value . To < Unit > ( ) ;
147+ var b = baseValue . To < Unit > ( ) ;
148+ var s = step . To < Unit > ( ) ;
156149
157- if ( v . Type != b . Type || v . Type != s . Type )
158- return false ;
150+ if ( v . Type != b . Type || v . Type != s . Type )
151+ return false ;
159152
160- var diff = v . Value - b . Value ;
153+ var diff = v . Value - b . Value ;
161154
162- if ( diff < 0 )
163- return false ;
155+ if ( diff < 0 )
156+ return false ;
164157
165- var q = diff / s . Value ;
166- var rq = Math . Round ( q ) ;
158+ var q = diff / s . Value ;
159+ var rq = Math . Round ( q ) ;
167160
168- return ( q - rq ) . Abs ( ) < 1e-10m ;
169- }
170- else
171- throw new NotSupportedException ( type . FullName ) ;
172- }
173- catch
174- {
175- return false ;
161+ return ( q - rq ) . Abs ( ) < 1e-10m ;
176162 }
163+ else
164+ throw new NotSupportedException ( type . FullName ) ;
177165 }
178166
179167 /// <summary>
@@ -202,13 +190,12 @@ public StrategyParam<T> SetStep(T step, T baseValue = default)
202190 if ( invalid )
203191 throw new ArgumentOutOfRangeException ( nameof ( step ) , step , LocalizedStrings . IntervalMustBePositive ) ;
204192
193+ if ( ! IsValueMatchesStep ( type , _value , step , baseValue ) )
194+ throw new ArgumentOutOfRangeException ( nameof ( step ) , step , LocalizedStrings . InvalidValue ) ;
195+
205196 _stepValue = step ;
206197 _stepBaseValue = baseValue ;
207198 _hasStep = true ;
208-
209- if ( ! IsStepValid ( _value ) )
210- throw new ArgumentOutOfRangeException ( nameof ( step ) , step , LocalizedStrings . InvalidValue ) ;
211-
212199 return this ;
213200 }
214201
0 commit comments