using System; using System.ServiceModel.Dispatcher; using System.Text; namespace Sony.Filtr.API.WCF { public class ArraySupportConverter : QueryStringConverter { readonly QueryStringConverter _inner; public ArraySupportConverter(QueryStringConverter inner) { this._inner = inner; } public override bool CanConvert(Type type) { var underlyingType = Nullable.GetUnderlyingType(type); return (underlyingType != null && base.CanConvert(underlyingType)) || type == typeof(string[]) || _inner.CanConvert(type); } public override object ConvertStringToValue(string parameter, Type parameterType) { if (parameter != null) { if (parameterType == typeof(string[])) { string[] parts = parameter.Split(','); var result = new string[parts.Length]; for (var i = 0; i < parts.Length; i++) result[i] = parts[i]; return result; } var underlyingType = Nullable.GetUnderlyingType(parameterType); // Handle nullable types if (underlyingType != null) { // Define a null value as being an empty or missing (null) string passed as the query parameter value return String.IsNullOrEmpty(parameter) ? null : base.ConvertStringToValue(parameter, underlyingType); } return base.ConvertStringToValue(parameter, parameterType); } return null; } // The override below is not needed if used only at the server public override string ConvertValueToString(object parameter, Type parameterType) { if (parameterType == typeof(string[])) { var intArray = (string[])parameter; var sb = new StringBuilder(); for (int i = 0; i < intArray.Length; i++) { if (i > 0) sb.Append(','); sb.Append(intArray[i]); } return sb.ToString(); } return _inner.ConvertValueToString(parameter, parameterType); } } }