@@ -21,46 +21,48 @@ public QueryString(T value)
2121 AttributedPublicProperties = FindAttributedPublicProperties < T , QueryStringParameterAttribute > ( ) ;
2222 }
2323
24- public IDictionary < string , string [ ] > GetKeyValuePairs ( )
24+ /// <summary>
25+ /// Returns formatted query string.
26+ /// </summary>
27+ /// <returns></returns>
28+ public string GetQueryString ( )
2529 {
26- var queryParameters = new Dictionary < string , string [ ] > ( ) ;
27- foreach ( var pair in AttributedPublicProperties )
30+ var queryStringBuilder = new StringBuilder ( ) ;
31+
32+ foreach ( var attributedProperty in AttributedPublicProperties )
2833 {
29- var property = pair . Key ;
30- var attribute = pair . Value ;
34+ var property = attributedProperty . Key ;
35+ var attribute = attributedProperty . Value ;
36+
3137 var value = property . GetValue ( Object , null ) ;
3238
3339 // 'Required' check
3440 if ( attribute . IsRequired && value == null )
3541 {
36- string propertyFullName = $ "{ property . DeclaringType ? . FullName } .{ property . Name } ";
42+ var propertyFullName = $ "{ property . DeclaringType ? . FullName } .{ property . Name } ";
3743 throw new ArgumentException ( "Got null/unset value for a required query parameter." , propertyFullName ) ;
3844 }
3945
40- // Serialize
46+ // Serialization
4147 if ( attribute . IsRequired || ! IsDefaultOfType ( value ) )
4248 {
43- var keyStr = attribute . Name ;
44- var valueStr = attribute . Convert ( value ! ) ;
49+ var queryParameterName = attribute . Name ;
4550
46- queryParameters [ keyStr ] = valueStr ;
51+ foreach ( var queryParameterValue in attribute . Convert ( value ! ) )
52+ {
53+ if ( queryStringBuilder . Length > 0 )
54+ {
55+ queryStringBuilder . Append ( '&' ) ;
56+ }
57+
58+ queryStringBuilder . Append ( Uri . EscapeDataString ( queryParameterName ) ) ;
59+ queryStringBuilder . Append ( '=' ) ;
60+ queryStringBuilder . Append ( Uri . EscapeDataString ( queryParameterValue ) ) ;
61+ }
4762 }
4863 }
4964
50- return queryParameters ;
51- }
52-
53- /// <summary>
54- /// Returns formatted query string.
55- /// </summary>
56- /// <returns></returns>
57- public string GetQueryString ( )
58- {
59- return string . Join ( "&" ,
60- GetKeyValuePairs ( ) . Select (
61- pair => string . Join ( "&" ,
62- pair . Value . Select (
63- v => $ "{ Uri . EscapeDataString ( pair . Key ) } ={ Uri . EscapeDataString ( v ) } ") ) ) ) ;
65+ return queryStringBuilder . ToString ( ) ;
6466 }
6567
6668 private static Dictionary < PropertyInfo , TAttribType > FindAttributedPublicProperties <
0 commit comments