コード例 #1
0
        public static void RegisterTypesFromAssembly(Assembly assembly)
        {
            if (assembly == null)
            {
                return;
            }
#if !XB1 // XB1_ALLINONEASSEMBLY
            if (m_registeredAssemblies.Contains(assembly))
            {
                return;
            }
            m_registeredAssemblies.Add(assembly);

            if (m_registered.Contains(assembly))
            {
                return;
            }
            m_registered.Add(assembly);
#endif // !XB1

#if XB1 // XB1_ALLINONEASSEMBLY
            if (m_registered == true)
            {
                return;
            }
            m_registered = true;
            foreach (Type type in MyAssembly.GetTypes())
#else // !XB1
            foreach (Type type in assembly.GetTypes())
#endif // !XB1
            {
                var descriptorArray = type.GetCustomAttributes(typeof(MyDefinitionTypeAttribute), false);

                if (descriptorArray.Length > 0)
                {
                    if (!type.IsSubclassOf(typeof(MyDefinitionBase)) && type != typeof(MyDefinitionBase))
                    {
                        MyLog.Default.Error("Type {0} is not a definition.", type.Name);
                        continue;
                    }

                    foreach (MyDefinitionTypeAttribute descriptor in descriptorArray)
                    {
                        m_definitionFactory.RegisterDescriptor(descriptor, type);
                        var pp = (MyDefinitionPostprocessor)Activator.CreateInstance(descriptor.PostProcessor);
                        pp.DefinitionType = descriptor.ObjectBuilderType;
                        m_postProcessors.Add(pp);
                        m_postprocessorsByType.Add(descriptor.ObjectBuilderType, pp);
                        MyXmlSerializerManager.RegisterObSerialzier(descriptor.ObjectBuilderType);
                    }

                    var tp = type;
                    while (tp != typeof(MyDefinitionBase))
                    {
                        tp = tp.BaseType;

                        HashSet <Type> children;
                        if (!m_childDefinitionMap.TryGetValue(tp, out children))
                        {
                            children = new HashSet <Type>();
                            m_childDefinitionMap[tp] = children;
                            children.Add(tp); // make sure it contains itself
                        }

                        children.Add(type);
                    }
                }
            }

            m_postProcessors.Sort(MyDefinitionPostprocessor.Comparer);
        }