private IManager AcquireComponent(PropertyInfo p, ManagerAttribute attr) { IManager manager = null; if (!string.IsNullOrEmpty(attr.CustomHookup)) { MethodInfo method = GetType().GetMethod(attr.CustomHookup, BindingFlags.Instance | BindingFlags.NonPublic); manager = method.Invoke(this, null) as IManager; } if (manager == null) { manager = gameObject.GetComponent(p.PropertyType) as IManager; } if (manager == null) { manager = gameObject.AddComponent(p.PropertyType) as IManager; } return(manager); }
private void LoadProperties() { PropertyInfo[] props = this.GetType().GetProperties(BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy); allManagers = new List <IManager>(); initOrder = new List <List <IManager> >(); List <IManager> finalStage = new List <IManager>(); foreach (PropertyInfo p in props) { object[] attributes = p.GetCustomAttributes(typeof(ManagerAttribute), true); ManagerAttribute attr = attributes.Length > 0 ? attributes[0] as ManagerAttribute : null; if (attr != null) { numManagers++; IManager manager = AcquireComponent(p, attr); allManagers.Add(manager); p.SetValue(this, manager, null); if (attr.InitStage.HasValue) { while (initOrder.Count <= attr.InitStage.Value) { initOrder.Add(new List <IManager>()); } initOrder[attr.InitStage.Value].Add(manager); } else { finalStage.Add(manager); } } } initOrder.Add(finalStage); // if you ever wanna pre init, call it here }