JD2022-TU1/main/tools/framework/JD.Reflection/MefImplementations/Model/ImportDefinition.cs

114 lines
3.4 KiB
C#

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<RequiredMetadataItem> m_requiredMetadata;
#endregion
#region Constructor
public ImportDefinition(PartDefinition part, string contractName, string requiredTypeIdentity, ImportCardinality cardinality, MemberInfo importingMember, IEnumerable<RequiredMetadataItem> requiredMetadata)
: this(part, contractName, requiredTypeIdentity, cardinality, new LazyMemberInfo(importingMember), requiredMetadata)
{
}
internal ImportDefinition(PartDefinition part, string contractName, string requiredTypeIdentity, ImportCardinality cardinality, LazyMemberInfo importingMember, IEnumerable<RequiredMetadataItem> 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<RequiredMetadataItem>();
}
#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<RequiredMetadataItem> 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
}
}