114 lines
3.4 KiB
C#
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
|
|
}
|
|
}
|