public string CreateUrl(NavigationTarget target) { var route = FindRoute(target); var url = Scheme + route.UrlPattern; var props = target.GetType().GetPropertiesHierarchical(); var routeVars = route.Segments.Where(x => x.IsVariable).Select(x => x.Name.ToLowerInvariant()); foreach (var prop in props) { var value = Uri.EscapeDataString(prop.GetValue(target) + ""); if (routeVars.Contains(prop.Name.ToLowerInvariant())) { url = url.Replace("{" + prop.Name.ToLowerInvariant() + "}", value); } else if (prop.PropertyType == typeof(string) || prop.PropertyType.GetTypeInfo().IsValueType) { url += url.Contains("?") ? "&" : "?"; url += prop.Name.ToLowerInvariant() + "=" + value; } } return url; }
public Route FindRoute(NavigationTarget target) { var route = _routes.FirstOrDefault(x => x.TargetType == target.GetType()); if (route == null) { throw new Exception("No route for NavigationTarget: " + target.GetType().Name); } return route; }