A few days a go i was going through my bookmarks, and came accross this post on the GetPaint.Net blog about using a fluent interface for parameter validation.
After reading the article, I tried the code out at home, and was very impressed. Not only does it read well, but also does not create any objects untill a piece of validation fails. Very nice.
However i wanted to use this at work, and this presented me with a problem. Work only has VS2005, which means no extension methods, which are the crux of how this validation method works.
I spent a while trying to see if it was possible to keep the fluent interface and not instantiate any objects until something fails. In the end i settled for this method which only creates one object.
Public Class Validate Public Shared Function Begin() As ValidationExpression Return New ValidationExpression End Function Public Class ValidationExpression Private _validation As Validation = Nothing Friend Sub New() End Sub Public Function IsNotNull(Of T)(ByVal obj As T, ByVal name As String) As ValidationExpression If obj Is Nothing Then Init() _validation.AddException(New ArgumentNullException(name)) End If Return Me End Function Public Function IsPositive(ByVal value As Integer, ByVal name As String) As ValidationExpression If value < 0 Then Init() _validation.AddException(New ArgumentOutOfRangeException(name, "must be positive, but was " & value.ToString)) End If Return Me End Function Public Function Check() As ValidationExpression If _validation Is Nothing Then Return Me End If If _validation.Exceptions.count = 1 Then Throw New ValidationException(_validation.Exceptions(0)) Else Throw New ValidationException(New MultiException(_validation.Exceptions)) End If End Function Private Sub Init() If _validation Is Nothing Then _validation = New Validation End If End Sub End Class End Class
The rest of the code used is identical to Rick Brewster’s Article, so head over there to see it in all its (well written) glory.