| File: System\Composition\TypedParts\Discovery\DiscoveredPropertyExport.cs | Web Access |
| Project: src\runtime\src\libraries\System.Composition.TypedParts\src\System.Composition.TypedParts.csproj (System.Composition.TypedParts) |
// 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.Composition.Hosting.Core; using System.Linq.Expressions; using System.Reflection; namespace System.Composition.TypedParts.Discovery { internal sealed class DiscoveredPropertyExport : DiscoveredExport { private static readonly MethodInfo s_activatorInvoke = typeof(CompositeActivator).GetRuntimeMethod("Invoke", new[] { typeof(LifetimeContext), typeof(CompositionOperation) }); private readonly PropertyInfo _property; public DiscoveredPropertyExport(CompositionContract contract, IDictionary<string, object> metadata, PropertyInfo property) : base(contract, metadata) { _property = property; } protected override ExportDescriptor GetExportDescriptor(CompositeActivator partActivator) { var args = new[] { Expression.Parameter(typeof(LifetimeContext)), Expression.Parameter(typeof(CompositionOperation)) }; var activator = Expression.Lambda<CompositeActivator>( Expression.Property( Expression.Convert(Expression.Call(Expression.Constant(partActivator), s_activatorInvoke, args), _property.DeclaringType), _property), args); return ExportDescriptor.Create(activator.Compile(), Metadata); } public override DiscoveredExport CloseGenericExport(TypeInfo closedPartType, Type[] genericArguments) { var closedContractType = Contract.ContractType.MakeGenericType(genericArguments); var newContract = Contract.ChangeType(closedContractType); var property = closedPartType.AsType().GetRuntimeProperty(_property.Name); return new DiscoveredPropertyExport(newContract, Metadata, property); } } }