public static ApiAction Get(IWebApi api, string methodName, string version) { if (string.IsNullOrEmpty(methodName)) { throw new ArgumentException(nameof(methodName)); } var invokeMethodName = methodName; var apiver = 0; if (version == null) { var index = methodName.LastIndexOf('V'); if (index > 0) { version = methodName.Remove(0, index + 1); if (int.TryParse(version, out apiver) && apiver >= 0) { methodName = methodName.Remove(index); } } } else if (int.TryParse(version, out apiver) && apiver >= 0) { invokeMethodName = methodName + "V" + version; } else { return(null); } try { var method = api.GetType().GetMethod(invokeMethodName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.DeclaredOnly | BindingFlags.InvokeMethod); if (method == null || method.Attributes.HasFlag(MethodAttributes.Abstract) || method.Attributes.HasFlag(MethodAttributes.SpecialName)) { return(null); } ApiAction action; if (Actions.TryGetValue(method, out action) == false) { action = new ApiAction(method) { Name = methodName, ApiVersion = apiver }; action.InitFilters(); Actions.TryAdd(method, action); } return(action); } catch (AmbiguousMatchException e) { Trace.WriteLine(e.Message); return(null); } }