Skip to content

Instantly share code, notes, and snippets.

@demius
Last active June 25, 2018 07:16
Show Gist options
  • Save demius/fda5ae083b66ffed97402855f97931c4 to your computer and use it in GitHub Desktop.
Save demius/fda5ae083b66ffed97402855f97931c4 to your computer and use it in GitHub Desktop.
A dynamic URI interpolator
public static class UriInterpolator
{
/// <summary>
/// Dynamically produces a parameterized path using the provided dynamic <paramref name="parameters"/> object
/// </summary>
/// <param name="path">The path with placeholders in the format of {paramName}</param>
/// <param name="parameters">A dynamic object representing parameter values to be interpolated into the <paramref name="path"/></param>
public static string BuildQueryPath(string path, dynamic parameters)
{
if (parameters == null)
return path;
var members = Dynamitey.Dynamic.GetMemberNames(parameters);
//if (!members.Any())
// return path;
var querystringParams = new List<string>();
var placeholders = Regex.Matches(path, @"{[0-9a-zA-Z]+?}")
.Cast<Match>()
.Select(m => m.Value.Trim('{', '}'))
.ToList();
foreach (var member in members)
{
var name = member;
var value = Dynamitey.Dynamic.InvokeGet(parameters, name);
if (!placeholders.Contains(member))
{
querystringParams.Add($"{name}={member}");
continue;
}
path = path.Replace($"{{{member}}}", Convert.ToString(value));
}
if (!querystringParams.Any())
return path;
return $"{path}?{string.Join("&", querystringParams)}";
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment