private void Initialize() { var types = AttributeHelper.GetClassesWithAttribute <MidgeControllerAttribute>(); _controllers = new Dictionary <string, MidgeControllerInfo>(StringComparer.OrdinalIgnoreCase); foreach (var type in types) { List <MidgeCommandInfo> commandInfo = new List <MidgeCommandInfo>(); MidgeControllerAttribute attr = type .GetCustomAttributes(typeof(MidgeControllerAttribute), true) .Cast <MidgeControllerAttribute>() .First(); if (!type.IsSubclassOf(typeof(ControllerBase))) { continue; } if (_controllers.ContainsKey(attr.ControllerName)) { throw new Exception($"Controller with name {attr.ControllerName} already exists"); } var methods = type.GetMethods().Where(i => i.GetCustomAttributes <MidgeCommandAttribute>().Any()); foreach (var method in methods) { var methodAttr = method.GetCustomAttribute <MidgeCommandAttribute>(); if (methodAttr == null) { continue; } var parameters = method.GetParameters(); var paramsWithAttr = parameters.Where(i => i.GetCustomAttribute <MidgeParameterAttribute>() != null); if (paramsWithAttr.Count() != parameters.Length) { throw new Exception($"Invalid parameters {method.Name}"); } MidgeParameterInfo[] parametersInfo = new MidgeParameterInfo[parameters.Length]; for (var i = 0; i < parameters.Length; i++) { var param = parameters[i]; MidgeParameterAttribute paramAttr = param.GetCustomAttribute <MidgeParameterAttribute>(); parametersInfo[i] = new MidgeParameterInfo(param.ParameterType, paramAttr.Name, paramAttr.IsRequired, i); } commandInfo.Add(new MidgeCommandInfo(methodAttr.CommandName, method, parametersInfo)); } _controllers.Add(attr.ControllerName, new MidgeControllerInfo(attr.ControllerName, type, commandInfo)); } }