protected bool Equals(RouteArgument other) { return(string.Equals(Key, other.Key) && Position == other.Position); }
public static Route Build(string pattern, Type handlerType, MethodInfo method) { pattern = pattern.Replace("___", "-").Replace("__", "_@"); var parts = pattern.Split('_') .Select(x => x.Replace("@", "_")).ToArray(); var verb = HttpVerbs.All.FirstOrDefault(x => x.EqualsIgnoreCase(parts[0])); if (verb.IsNotEmpty()) { parts = parts.Skip(1).ToArray(); } else { verb = HttpVerbs.GET; } var segments = parts .Select((x, position) => new Segment(x.ToLowerInvariant(), position)) .OfType <ISegment>() .ToArray(); Type inputType = DetermineInputType(method); var hasPrimitives = method.GetParameters().Any(x => x.ParameterType == typeof(Guid) || RouteArgument.Conversions.Has(x.ParameterType)); if (hasPrimitives) { for (var i = 0; i < segments.Length; i++) { var current = parts[i]; var parameter = method.GetParameters().FirstOrDefault(x => x.Name == current); if (parameter != null) { var argument = new RouteArgument(parameter, i); segments[i] = argument; } } } else if (inputType != null) { var members = inputType.GetProperties().OfType <MemberInfo>().Concat(inputType.GetFields()).ToArray(); for (var i = 0; i < segments.Length; i++) { var current = parts[i]; var member = members.FirstOrDefault(x => x.Name == current); if (member != null) { var argument = new RouteArgument(member, i); segments[i] = argument; } } } var route = new Route(segments, verb, env => Task.CompletedTask) { HandlerType = handlerType, Method = method, InputType = inputType }; method.ForAttribute <RouteNameAttribute>(att => route.Name = att.Name); return(route); }