| File: System\ComponentModel\Composition\Hosting\CatalogExportProvider.CatalogChangeProxy.cs | Web Access |
| Project: src\runtime\src\libraries\System.ComponentModel.Composition\src\System.ComponentModel.Composition.csproj (System.ComponentModel.Composition) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; using System.ComponentModel.Composition.Primitives; using System.Linq; using Microsoft.Internal; namespace System.ComponentModel.Composition.Hosting { public partial class CatalogExportProvider : ExportProvider, IDisposable { private sealed class CatalogChangeProxy : ComposablePartCatalog { private readonly ComposablePartCatalog _originalCatalog; private readonly List<ComposablePartDefinition> _addedParts; private readonly HashSet<ComposablePartDefinition> _removedParts; public CatalogChangeProxy(ComposablePartCatalog originalCatalog, IEnumerable<ComposablePartDefinition> addedParts, IEnumerable<ComposablePartDefinition> removedParts) { _originalCatalog = originalCatalog; _addedParts = new List<ComposablePartDefinition>(addedParts); _removedParts = new HashSet<ComposablePartDefinition>(removedParts); } public override IEnumerator<ComposablePartDefinition> GetEnumerator() { return _originalCatalog.Concat(_addedParts).Except(_removedParts).GetEnumerator(); } public override IEnumerable<Tuple<ComposablePartDefinition, ExportDefinition>> GetExports( ImportDefinition definition) { Requires.NotNull(definition, nameof(definition)); var originalExports = _originalCatalog.GetExports(definition); var trimmedExports = originalExports.Where(partAndExport => !_removedParts.Contains(partAndExport.Item1)); var addedExports = new List<Tuple<ComposablePartDefinition, ExportDefinition>>(); foreach (var part in _addedParts) { foreach (var export in part.ExportDefinitions) { if (definition.IsConstraintSatisfiedBy(export)) { addedExports.Add(new Tuple<ComposablePartDefinition, ExportDefinition>(part, export)); } } } return trimmedExports.Concat(addedExports); } } } }