using System; using System.IO; namespace Some.Namespace { /// <summary> /// Extensions for most common used cases. /// </summary> public static class Extensions { private static readonly Func<string, string> EnsureTrailingSlash = value => value.EndsWith("/") ? value : value + "/"; private static readonly Func<string, string> EnsureNoHeadSlash = value => value.StartsWith("/") && value.Length > 1 ? value.Substring(1) : value; /// <summary> /// Combines multiple parts to an existing Uri. /// </summary> /// <param name="uri">base uri.</param> /// <param name="parts">parts to append.</param> /// <returns>final uri.</returns> public static Uri Combine(this Uri uri, params string[] parts) { if (uri == null) { return null; } if (parts == null || parts.Length == 0) { return uri; } var baseUrl = uri.OriginalString; var updatedBase = baseUrl; foreach (var part in parts) { var newBase = EnsureTrailingSlash(updatedBase); var newPart = EnsureNoHeadSlash(part); updatedBase = Path.Combine(newBase, newPart); } return new Uri(EnsureTrailingSlash(updatedBase)); } } }