Esempio n. 1
0
        private static void UpdateSerializationSystems()
        {
            if (!_isDirty)
            {
                return;
            }

            _assemblyLoader.OnAssemblyLoaded -= SetDirty;

            Dictionary <Type, List <Pair> > candidates = new Dictionary <Type, List <Pair> >();

            var searchSet = new Queue <Assembly>(_assemblyLoader.GetAssemblies());
            var foundSet  = new HashSet <Assembly>();

            Action <Assembly> onAssemblyLoaded = a =>
            {
                if (foundSet.Contains(a))
                {
                    return;
                }

                searchSet.Enqueue(a);
            };

            _assemblyLoader.OnAssemblyLoaded += onAssemblyLoaded;

            while (searchSet.Count > 0)
            {
                var ass = searchSet.Dequeue();
                foundSet.Add(ass);

                foreach (var type in TypeTools.GetAllTypes(ass).Where(t => !(t.IsAbstract() || t.IsInterface())))
                {
                    var key = _validTypes.FirstOrDefault(i => TypeTools.IsAssignableFrom(i, type));
                    if (key == null)
                    {
                        continue;
                    }

                    var att = type.GetTypeAttributes <DefaultSerializationSystemAttribute>(false).FirstOrDefault();
                    if (att == null)
                    {
                        continue;
                    }

                    List <Pair> set;
                    if (!candidates.TryGetValue(key, out set))
                    {
                        set             = new List <Pair>();
                        candidates[key] = set;
                    }

                    set.Add(Tuples.Create(att, type));
                }
            }

            _assemblyLoader.OnAssemblyLoaded -= onAssemblyLoaded;

            RecalcTypeTrees(_surrogateSelector, candidates);
            RecalcTypeTrees(_formatterSelector, candidates);

            _assemblyLoader.OnAssemblyLoaded += SetDirty;
            _isDirty = false;
        }