public RouteReflector(IRouteReflectorOptions options) { _options = options; }
private static string ReplaceRoutePlaceholders(string routeTemplate, Type controller, MethodInfo action, IRouteReflectorOptions options) { var partRegexSquare = new Regex(@"\[(?<part>[^]=?]+)[?]?(=[^]]+)?\]"); var partRegexBraces = new Regex(@"\{(?<part>[^}=?]+)[?]?(=[^}]+)?\}"); string ExtractParameterName(string part) => !part.Contains(':') ? part : part.Substring(0, part.IndexOf(':')); bool DoesRouteParamExist(string paramName) { if (action.GetParameters() .Any(p => p.Name?.Equals(paramName, StringComparison.InvariantCultureIgnoreCase) ?? false)) return true; if (action.GetParameters() .Where(p => !options.TypeConverter.TreatAsPrimitive(p.ParameterType.UnwrapNullable()) && !p.ParameterType.IsCollection() && p.GetCustomAttributes(StaticConfig.Instance.FromRouteAttribute).Any()) .Any(p => p.ParameterType.GetProperties().Any(prop => prop.Name.Equals(paramName, StringComparison.InvariantCultureIgnoreCase)))) return true; return false; } string MatchReplacer(Match match) => match.Groups["part"].Value switch { "controller" => controller.Name.Replace("Controller", "").ToLower(), "action" => action.Name.ToLower(), _ => DoesRouteParamExist(ExtractParameterName(match.Groups["part"].Value)) ? $"{{{ExtractParameterName(match.Groups["part"].Value)}}}" : "" }; return partRegexSquare.Replace( partRegexBraces.Replace(routeTemplate, MatchReplacer), MatchReplacer); }
internal static string DefaultBuildRouteStrategy(Type controller, MethodInfo action, string defaultRoute, IRouteReflectorOptions options) { var controllerRouteTemplate = controller.GetCustomAttributes(StaticConfig.Instance.RouteAttribute) .Select(StaticConfig.Instance.GetTemplateFromRouteAttribute) .FirstOrDefault(); var methodRouteTemplate = action.GetCustomAttributes(StaticConfig.Instance.RouteAttribute) .Select(StaticConfig.Instance.GetTemplateFromRouteAttribute) .FirstOrDefault(); var httpMethodTemplate = action.GetCustomAttributes() .Where(a => StaticConfig.Instance.HttpMethodBaseAttribute.IsInstanceOfType(a)) .Select(StaticConfig.Instance.GetTemplateFromHttpMethodAttribute) .FirstOrDefault(); var parts = new List<string>(); if (methodRouteTemplate?.StartsWith("/") != true && controllerRouteTemplate != null) parts.Add(controllerRouteTemplate); if (methodRouteTemplate != null) parts.Add(methodRouteTemplate); if (httpMethodTemplate != null) { if (httpMethodTemplate.StartsWith("/")) parts = new List<string> {httpMethodTemplate}; else parts.Add(httpMethodTemplate); } var routeTemplate = parts.Any() ? string.Join("/", parts) : defaultRoute; return ReplaceRoutePlaceholders(routeTemplate, controller, action, options) .Trim('/'); }