Пример #1
0
        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());
        }