using System; using System.Collections; using System.Collections.Generic; using System.Linq; namespace Retailcrm { /// /// QueryBuilder /// public class QueryBuilder { private readonly List> _keyValuePairs = new List>(); /// /// Build PHP like query string /// /// /// /// public static string BuildQueryString(object queryData, string argSeperator = "&") { var encoder = new QueryBuilder(); encoder.AddEntry(null, queryData, allowObjects: true); return encoder.GetUriString(argSeperator); } /// /// GetUriString /// /// /// private string GetUriString(string argSeperator) { return String.Join(argSeperator, _keyValuePairs.Select(kvp => { var key = Uri.EscapeDataString(kvp.Key); var value = Uri.EscapeDataString(kvp.Value.ToString()); return $"{key}={value}"; })); } /// /// AddEntry /// /// /// /// private void AddEntry(string prefix, object instance, bool allowObjects) { var dictionary = instance as IDictionary; var collection = instance as ICollection; if (dictionary != null) { Add(prefix, GetDictionaryAdapter(dictionary)); } else if (collection != null) { Add(prefix, GetArrayAdapter(collection)); } else if (allowObjects) { Add(prefix, GetObjectAdapter(instance)); } else { _keyValuePairs.Add(new KeyValuePair(prefix, instance)); } } /// /// Add /// /// /// private void Add(string prefix, IEnumerable datas) { foreach (var item in datas) { var newPrefix = String.IsNullOrEmpty(prefix) ? item.Key : $"{prefix}[{item.Key}]"; AddEntry(newPrefix, item.Value, allowObjects: false); } } /// /// Entry /// private struct Entry { public string Key; public object Value; } /// /// GetObjectAdapter /// /// /// private IEnumerable GetObjectAdapter(object data) { var properties = data.GetType().GetProperties(); foreach (var property in properties) { yield return new Entry { Key = property.Name, Value = property.GetValue(data) }; } } /// /// GetArrayAdapter /// /// /// private IEnumerable GetArrayAdapter(ICollection collection) { int i = 0; foreach (var item in collection) { yield return new Entry { Key = i.ToString(), Value = item }; i++; } } /// /// GetDictionaryAdapter /// /// /// private IEnumerable GetDictionaryAdapter(IDictionary collection) { foreach (DictionaryEntry item in collection) { yield return new Entry { Key = item.Key.ToString(), Value = item.Value }; } } } }