コード例 #1
0
        protected virtual void BuildCache()
        {
            System.Type v_safeFilterType         = m_filterType == null ? (m_acceptAbstract ? typeof(object) : null) : m_filterType;
            string      v_safeTypeNameInAssembly = GetSafeTypedNameInAssembly(v_safeFilterType);
            ArrayDict <Assembly, System.Type[]> v_assemblyTypesDict = AssemblyUtils.GetAssemblyTypesDict(false);
            List <Assembly> v_assemblies = new List <Assembly>();

            m_currentAssembly = m_currentType == null || m_currentType.CastedType == null ? null : m_currentType.CastedType.Assembly;

            //Filter Assemblies
            foreach (KVPair <Assembly, System.Type[]> v_pair in v_assemblyTypesDict)
            {
                if (v_pair != null && v_pair.Key != null)
                {
                    if (AssemblyContainsFilteredType(v_pair.Key, m_filterType, m_acceptGeneric, m_acceptAbstract))
                    {
                        v_assemblies.Add(v_pair.Key);
                    }
                    try
                    {
                        if (m_currentAssembly == null && m_currentType != null && ((SerializableType)m_currentType).StringType.Contains(v_pair.Key.FullName))
                        {
                            m_currentAssembly = v_pair.Key;
                        }
                    }
                    catch { }
                }
            }
            if (m_acceptNull)
            {
                v_assemblies.Insert(0, null);
            }

            if (m_currentAssembly == null && !m_acceptNull)
            {
                m_currentAssembly = v_safeFilterType.Assembly;
            }

            //Draw Popup Select Assembly
            m_possibleAssemblies       = v_assemblies.ToArray();
            m_possibleAssembliesString = v_assemblies.GetStringList().ToArray();
            m_selectedAssemblyIndex    = v_assemblies.Contains(m_currentAssembly) ? v_assemblies.IndexOf(m_currentAssembly) : -1;

            //Pick All Types if dont use Assembly Filter
            List <System.Type> v_assemblyTypes = new List <System.Type>();

            foreach (var v_assembly in v_assemblies)
            {
                try
                {
                    var v_types = v_assemblyTypesDict.GetValueWithKey(v_assembly);
                    if (v_types != null)
                    {
                        foreach (System.Type v_type in v_types)
                        {
                            if (v_type != null &&
                                (!v_type.IsGenericTypeDefinition || m_acceptGeneric) &&
                                (!v_type.IsAbstract || m_acceptAbstract) &&
                                (m_filterType == null ||
                                 TypeExtensions.IsSameOrSubClassOrImplementInterface(v_type, m_filterType) ||
                                 v_type.FullName.Contains(v_safeTypeNameInAssembly)))
                            {
                                v_assemblyTypes.Add(v_type);
                            }
                        }
                    }
                }
                catch { }
            }

            if (m_acceptNull)
            {
                v_assemblyTypes.Insert(0, null);
            }
            m_possibleTypesInAllAssemblies       = v_assemblyTypes.ToArray();
            m_possibleTypesInAllAssembliesString = v_assemblyTypes.GetStringList().ToArray();
            if (m_currentType == null && !m_acceptNull)
            {
                m_selectedTypeIndexInAllAssemblies = v_assemblyTypes.Contains(v_safeFilterType) ? v_assemblyTypes.IndexOf(v_safeFilterType) : -1;
            }
            else
            {
                m_selectedTypeIndexInAllAssemblies = v_assemblyTypes.Contains(m_currentType) ? v_assemblyTypes.IndexOf(m_currentType) : -1;
            }


            //Filter Types in Assembly Current Assembly
            v_assemblyTypes.Clear();
            if (m_currentAssembly != null)
            {
                try
                {
                    var v_types = v_assemblyTypesDict.GetValueWithKey(m_currentAssembly);
                    if (v_types != null)
                    {
                        foreach (System.Type v_type in v_types)
                        {
                            if (v_type != null &&
                                (!v_type.IsGenericTypeDefinition || m_acceptGeneric) &&
                                (!v_type.IsAbstract || m_acceptAbstract) &&
                                (m_filterType == null ||
                                 TypeExtensions.IsSameOrSubClassOrImplementInterface(v_type, m_filterType) ||
                                 v_type.FullName.Contains(v_safeTypeNameInAssembly)))
                            {
                                v_assemblyTypes.Add(v_type);
                            }
                        }
                    }
                }
                catch { }
            }
            if (m_acceptNull)
            {
                v_assemblyTypes.Insert(0, null);
            }
            m_possibleTypesInCurrentAssembly       = v_assemblyTypes.ToArray();
            m_possibleTypesInCurrentAssemblyString = v_assemblyTypes.GetStringList().ToArray();
            if (m_currentType == null && !m_acceptNull)
            {
                m_selectedTypeIndexInCurrentAssembly = v_assemblyTypes.Contains(v_safeFilterType) ? v_assemblyTypes.IndexOf(v_safeFilterType) : -1;
            }
            else
            {
                m_selectedTypeIndexInCurrentAssembly = v_assemblyTypes.Contains(m_currentType) ? v_assemblyTypes.IndexOf(m_currentType) : -1;
            }
        }