using System.Collections.Generic; using System.Linq; using System.Reflection; using JD.Kernel.StaticHelpers; using JD.Reflection.Attributes; using JD.Reflection.MefImplementations.Metadata; using JD.Reflection.MefImplementations.Model.Internal; namespace JD.Reflection.MefImplementations.Model { public class ImportDefinition { #region Variables private readonly PartDefinition m_part; private readonly string m_contractName; private readonly string m_requiredTypeIdentity; private readonly ImportCardinality m_cardinality; private readonly LazyMemberInfo m_importingMember; private readonly IEnumerable m_requiredMetadata; #endregion #region Constructor public ImportDefinition(PartDefinition part, string contractName, string requiredTypeIdentity, ImportCardinality cardinality, MemberInfo importingMember, IEnumerable requiredMetadata) : this(part, contractName, requiredTypeIdentity, cardinality, new LazyMemberInfo(importingMember), requiredMetadata) { } internal ImportDefinition(PartDefinition part, string contractName, string requiredTypeIdentity, ImportCardinality cardinality, LazyMemberInfo importingMember, IEnumerable requiredMetadata) { Throw.IfNull(part, "part"); Throw.IfEmpty(contractName, "contractName"); Throw.IfNull(importingMember, "importingMember"); m_part = part; m_contractName = contractName; m_requiredTypeIdentity = requiredTypeIdentity; m_cardinality = cardinality; m_importingMember = importingMember; m_requiredMetadata = requiredMetadata ?? Enumerable.Empty(); } #endregion #region Properties public PartDefinition Part { get { return m_part; } } public string ContractName { get { return m_contractName; } } public string RequiredTypeIdentity { get { return m_requiredTypeIdentity; } } public ImportCardinality Cardinality { get { return m_cardinality; } } public IEnumerable RequiredMetadata { get { return m_requiredMetadata; } } #endregion #region Methods public MemberInfo GetImportingMember() { return m_importingMember.Member; } public bool IsSatisfiedBy(ExportDefinition export) { if (!Equals(ContractName, export.ContractName)) { return false; } if (!string.IsNullOrEmpty(RequiredTypeIdentity) && !Equals(RequiredTypeIdentity, export.ExportTypeIdentity)) { return false; } foreach (var requiredMetadata in RequiredMetadata) { object value; if (!export.Metadata.TryGetValue(requiredMetadata.Key, out value) || !requiredMetadata.Type.IsInstanceOfType(value)) { return false; } } return true; } public override string ToString() { return $"{ContractName} [RequiredTypeIdentity: {RequiredTypeIdentity}]"; } #endregion } }