e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
91 lines
3.1 KiB
C#
91 lines
3.1 KiB
C#
//---------------------------------------------------------------------
|
|
// <copyright file="KnownAssembliesSet.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
//
|
|
// @owner [....]
|
|
// @backupOwner [....]
|
|
//---------------------------------------------------------------------
|
|
|
|
using System;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
|
|
namespace System.Data.Metadata.Edm
|
|
{
|
|
/// <summary>
|
|
/// 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
|
|
/// </summary>
|
|
internal class KnownAssembliesSet
|
|
{
|
|
private Dictionary<Assembly, KnownAssemblyEntry> _assemblies;
|
|
internal KnownAssembliesSet()
|
|
{
|
|
_assemblies = new Dictionary<Assembly, KnownAssemblyEntry>();
|
|
}
|
|
|
|
internal KnownAssembliesSet(KnownAssembliesSet set)
|
|
{
|
|
_assemblies = new Dictionary<Assembly, KnownAssemblyEntry>(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<Assembly> Assemblies
|
|
{
|
|
get { return _assemblies.Keys; }
|
|
}
|
|
|
|
public IEnumerable<KnownAssemblyEntry> 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);
|
|
}
|
|
}
|
|
}
|
|
}
|