private string[] CheckKeyParameters(ClrTypeInfo type, ParameterInfo[] paras) { var keys = type.Keys; if (paras.Length < keys.Length) { return(null); } var result = new string[keys.Length]; for (int i = 0; i < keys.Length; i++) { var key = keys[i]; var para = paras[i]; if (key.PropertyType != para.ParameterType) { return(null); } if (!para.IsDefined(Constants.FromODataUri)) { var name = Constants.KeyParameterName; if (keys.Length > 1) { name += key.Name; } if (para.Name != name) { return(null); } } result[i] = para.Name; } return(result); }
/// <summary> /// 创建控制器信息体。 /// </summary> /// <param name="clrtype">数据对象CLR类型信息。</param> /// <param name="controller">控制器类型。</param> /// <param name="name">控制器名称。</param> public ControllerInfo(ClrTypeInfo clrtype, Type controller, string name) { Methods = new Dictionary <EControllerMethodKind, IControllerMethod>(); Navigates = new Dictionary <string, UnboundMethod>(); BoundActions = new Dictionary <string, BoundMethod>(); UnboundActions = new Dictionary <string, UnboundMethod>(); BoundFunctions = new Dictionary <string, BoundFunctionMethod>(); UnboundFunctions = new Dictionary <string, UnboundFunctionMethod>(); Name = name; Initialization(clrtype, controller); }
private bool ProcessBodyMethod(ClrTypeInfo type, MethodInfo method, EControllerMethodKind kind) { var paras = method.GetParameters(); if (paras.Length == 1 && paras[0].IsDefined(Constants.FromBody)) { Methods.AddOrUpdate(kind, new BoundMethod(method)); return(true); } return(false); }
private bool ProcessKeysMethod(ClrTypeInfo type, MethodInfo method, EControllerMethodKind kind) { var paras = method.GetParameters(); var keys = CheckKeyParameters(type, paras); if (keys != null && keys.Length == paras.Length) { Methods.AddOrUpdate(kind, new UnboundMethod(method, keys)); return(true); } return(false); }
private bool ProcessKeysBodyMethod(ClrTypeInfo type, MethodInfo method, EControllerMethodKind kind) { var paras = method.GetParameters(); var keys = CheckKeyParameters(type, paras); if (keys != null && keys.Length == paras.Length) { if (paras.Length == keys.Length + 1 && paras[keys.Length].IsDefined(Constants.FromBody)) { Methods.AddOrUpdate(kind, new UnboundMethod(method, keys)); return(true); } } return(false); }
private bool ProcessRefMethod(ClrTypeInfo type, MethodInfo method) { var paras = method.GetParameters(); if (paras.Length == 2 && paras[0].ParameterType == typeof(string) && paras[1].IsDefined(Constants.FromBody)) { var kind = method.Name == Constants.ActionCreateRef ? EControllerMethodKind.CreateRefBatch : EControllerMethodKind.DeleteRefBatch; Methods.AddOrUpdate(kind, new BoundFunctionMethod(method, paras[0].Name)); return(true); } else { var keys = CheckKeyParameters(type, paras); if (keys != null) { if (paras.Length == keys.Length + 1 && method.Name == Constants.ActionDeleteRef) { var para = paras[keys.Length]; if (para.ParameterType == typeof(string)) { Methods.AddOrUpdate(EControllerMethodKind.DeleteRefObject, new UnboundFunctionMethod(method, keys, para.Name)); return(true); } } else if (paras.Length == keys.Length + 2) { var navigate = paras[keys.Length]; var link = paras[keys.Length + 1]; if (navigate.ParameterType == link.ParameterType && link.ParameterType == typeof(string)) { var kind = method.Name == Constants.ActionCreateRef ? EControllerMethodKind.CreateRef : EControllerMethodKind.DeleteRef; Methods.AddOrUpdate(kind, new UnboundFunctionMethod(method, keys, navigate.Name, link.Name)); return(true); } } } } return(false); }
private void Initialization(ClrTypeInfo type, Type controllerType) { var methods = controllerType.GetMethods(); foreach (var method in methods) { var name = method.Name; var paras = method.GetParameters(); if (name == Constants.ActionCreateRef || name == Constants.ActionDeleteRef) { if (ProcessRefMethod(type, method)) { continue; } } else if (name == Constants.ActionPrefixGet || name == Constants.ActionPrefixGet + Name) { if (paras.Length == 0) { Methods.AddOrUpdate(EControllerMethodKind.GetItems, new BoundMethod(method)); continue; } if (ProcessKeysMethod(type, method, EControllerMethodKind.GetItem)) { continue; } } else if (name == Constants.ActionPrefixPost || name == Constants.ActionPrefixPost + Name) { if (ProcessBodyMethod(type, method, EControllerMethodKind.PostItems)) { continue; } } else if (name == Constants.ActionPrefixPut || name == Constants.ActionPrefixPut + Name) { if (ProcessBodyMethod(type, method, EControllerMethodKind.PutItems) || ProcessKeysBodyMethod(type, method, EControllerMethodKind.PutItem)) { continue; } } else if (name == Constants.ActionPrefixDelete || name == Constants.ActionPrefixDelete + Name) { if (ProcessBodyMethod(type, method, EControllerMethodKind.DeleteItems) || ProcessKeysMethod(type, method, EControllerMethodKind.DeleteItem)) { continue; } } else if (name.StartsWith("Get")) { var subname = name.Substring(3); if (type.Navigates.ContainsKey(subname)) { var keys = CheckKeyParameters(type, paras); if (keys != null && keys.Length == paras.Length) { Navigates.AddOrUpdate(subname, new UnboundMethod(method, keys)); continue; } } } if (method.IsDefined(Constants.HttpGet)) { var keys = CheckKeyParameters(type, paras); if (keys != null) { var names = new string[paras.Length - keys.Length]; for (int i = 0; i < names.Length; i++) { names[i] = paras[keys.Length + i].Name; } UnboundFunctions.AddOrUpdate(method.Name, new UnboundFunctionMethod(method, keys)); } else { BoundFunctions.AddOrUpdate(method.Name, new BoundFunctionMethod(method, paras.Select(a => a.Name).ToArray())); } } else if (method.IsDefined(Constants.HttpPost)) { var keys = CheckKeyParameters(type, paras); if (keys != null) { UnboundActions.AddOrUpdate(method.Name, new UnboundMethod(method, keys)); } else { BoundActions.AddOrUpdate(method.Name, new BoundMethod(method)); } } } }