in src/Microsoft.VisualStudio.Composition/Configuration/AttributedPartDiscoveryV1.cs [281:348]
private bool TryCreateImportDefinition(Type importingType, ICustomAttributeProvider member, [NotNullWhen(true)] out ImportDefinition? importDefinition)
{
Requires.NotNull(importingType, nameof(importingType));
Requires.NotNull(member, nameof(member));
ImportAttribute importAttribute = member.GetFirstAttribute<ImportAttribute>();
ImportManyAttribute importManyAttribute = member.GetFirstAttribute<ImportManyAttribute>();
// Importing constructors get implied attributes on their parameters.
if (importAttribute == null && importManyAttribute == null && member is ParameterInfo)
{
importAttribute = new ImportAttribute();
}
if (importAttribute != null)
{
this.ThrowOnInvalidImportingMemberOrParameter(member, isImportMany: false);
if (importAttribute.Source != ImportSource.Any)
{
throw new NotSupportedException(Strings.CustomImportSourceNotSupported);
}
var requiredCreationPolicy = importingType.IsExportFactoryTypeV1()
? CreationPolicy.NonShared
: (CreationPolicy)importAttribute.RequiredCreationPolicy;
Type contractType = importAttribute.ContractType ?? GetTypeIdentityFromImportingType(importingType, importMany: false);
var constraints = PartCreationPolicyConstraint.GetRequiredCreationPolicyConstraints(requiredCreationPolicy)
.Union(this.GetMetadataViewConstraints(importingType, importMany: false))
.Union(GetExportTypeIdentityConstraints(contractType));
importDefinition = new ImportDefinition(
string.IsNullOrEmpty(importAttribute.ContractName) ? GetContractName(contractType) : importAttribute.ContractName!,
importAttribute.AllowDefault ? ImportCardinality.OneOrZero : ImportCardinality.ExactlyOne,
GetImportMetadataForGenericTypeImport(contractType),
constraints);
return true;
}
else if (importManyAttribute != null)
{
this.ThrowOnInvalidImportingMemberOrParameter(member, isImportMany: true);
if (importManyAttribute.Source != ImportSource.Any)
{
throw new NotSupportedException(Strings.CustomImportSourceNotSupported);
}
var requiredCreationPolicy = GetElementTypeFromMany(importingType).IsExportFactoryTypeV1()
? CreationPolicy.NonShared
: (CreationPolicy)importManyAttribute.RequiredCreationPolicy;
Type contractType = importManyAttribute.ContractType ?? GetTypeIdentityFromImportingType(importingType, importMany: true);
var constraints = PartCreationPolicyConstraint.GetRequiredCreationPolicyConstraints(requiredCreationPolicy)
.Union(this.GetMetadataViewConstraints(importingType, importMany: true))
.Union(GetExportTypeIdentityConstraints(contractType));
importDefinition = new ImportDefinition(
string.IsNullOrEmpty(importManyAttribute.ContractName) ? GetContractName(contractType) : importManyAttribute.ContractName!,
ImportCardinality.ZeroOrMore,
GetImportMetadataForGenericTypeImport(contractType),
constraints);
return true;
}
else
{
importDefinition = null;
return false;
}
}