//--------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System; using System.Linq; using System.Reflection; using System.Collections.Generic; using System.Diagnostics; namespace System.Data.Metadata.Edm { /// /// This class is responsible for keeping track of which assemblies we have already /// considered so we don't reconsider them again. /// /// The current rules for an assembly to be "seen" is /// 1. It is already in our dictionary /// AND /// 1. We are in attribute loading mode /// OR /// 2. We have seen it already with a non null EdmItemCollection /// OR /// 3. We are seeing it with a null EdmItemCollection this time /// internal class KnownAssembliesSet { private Dictionary _assemblies; internal KnownAssembliesSet() { _assemblies = new Dictionary(); } internal KnownAssembliesSet(KnownAssembliesSet set) { _assemblies = new Dictionary(set._assemblies); } internal bool TryGetKnownAssembly(Assembly assembly, object loaderCookie, EdmItemCollection itemCollection, out KnownAssemblyEntry entry) { if (!_assemblies.TryGetValue(assembly, out entry)) { return false; } if (!entry.HaveSeenInCompatibleContext(loaderCookie, itemCollection)) { return false; } return true; } internal IEnumerable Assemblies { get { return _assemblies.Keys; } } public IEnumerable GetEntries(object loaderCookie, EdmItemCollection itemCollection) { return _assemblies.Values.Where(e => e.HaveSeenInCompatibleContext(loaderCookie, itemCollection)); } internal bool Contains(Assembly assembly, object loaderCookie, EdmItemCollection itemCollection) { KnownAssemblyEntry entry; return TryGetKnownAssembly(assembly, loaderCookie, itemCollection, out entry); } internal void Add(Assembly assembly, KnownAssemblyEntry knownAssemblyEntry) { KnownAssemblyEntry current; if (_assemblies.TryGetValue(assembly, out current)) { Debug.Assert(current.SeenWithEdmItemCollection != knownAssemblyEntry.SeenWithEdmItemCollection && knownAssemblyEntry.SeenWithEdmItemCollection, "should only be updating if we haven't seen it with an edmItemCollection yet."); _assemblies[assembly] = knownAssemblyEntry; } else { _assemblies.Add(assembly, knownAssemblyEntry); } } } }