private void RemoveManagerInteral(ScriptBehaviourManager manager) { if (!m_BehaviourManagers.Remove(manager)) { throw new ArgumentException($"manager does not exist in the world"); } ++Version; var type = manager.GetType(); while (type != typeof(ScriptBehaviourManager)) { if (m_BehaviourManagerLookup[type] == manager) { m_BehaviourManagerLookup.Remove(type); foreach (var otherManager in m_BehaviourManagers) { if (otherManager.GetType().IsSubclassOf(type)) { AddTypeLookup(otherManager.GetType(), otherManager); } } } type = type.BaseType; } }
internal static T[] GetAllInjectedManagers <T>(ScriptBehaviourManager host, World world) where T : ScriptBehaviourManager { var result = new List <T>(); var fields = host.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); foreach (var field in fields) { var attr = field.GetCustomAttributes(typeof(InjectAttribute), true); if (attr.Length == 0) { continue; } if (!field.FieldType.IsClass) { continue; } if (!field.FieldType.IsSubclassOf(typeof(T))) { continue; } result.Add((T)world.GetOrCreateManager(field.FieldType)); } return(result.ToArray()); }
internal static T[] GetAllInjectedManagers <T>(ScriptBehaviourManager host, World world) where T : ScriptBehaviourManager { List <T> list = new List <T>(); foreach (FieldInfo info in host.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)) { object[] customAttributes = info.GetCustomAttributes(typeof(InjectAttribute), true); bool flag = customAttributes.Length == 0; if ((!flag && info.FieldType.IsClass) && info.FieldType.IsSubclassOf(typeof(T))) { list.Add((T)world.GetOrCreateManager(info.FieldType)); } } return(list.ToArray()); }