in src/Microsoft.VisualStudio.Composition/ImportMetadataViewConstraint.cs [68:148]
public bool IsSatisfiedBy(ExportDefinition exportDefinition)
{
Requires.NotNull(exportDefinition, nameof(exportDefinition));
// Fast path since immutable dictionaries are slow to enumerate.
if (this.Requirements.IsEmpty)
{
return true;
}
Assumes.NotNull(this.Resolver);
foreach (var entry in this.Requirements)
{
object? value;
if (!LazyMetadataWrapper.TryGetLoadSafeValueTypeRef(exportDefinition.Metadata, entry.Key, this.Resolver, out value))
{
if (entry.Value.IsMetadataumValueRequired)
{
return false;
}
else
{
// It's not required, and it's not present. No more validation necessary.
continue;
}
}
TypeRef metadatumValueTypeRef = entry.Value.MetadatumValueTypeRef;
if (value == null)
{
if (metadatumValueTypeRef.IsValueType)
{
// A null reference for a value type is not a compatible match.
return false;
}
else
{
// Null is assignable to any reference type.
continue;
}
}
if (value is TypeRef valueTypeRef)
{
if (!metadatumValueTypeRef.ElementTypeRef.IsAssignableFrom(valueTypeRef.ElementTypeRef))
{
return false;
}
continue;
}
if (value is TypeRef[] valueTypeRefArray && metadatumValueTypeRef.ElementTypeRef != metadatumValueTypeRef)
{
var receivingElementTypeRef = metadatumValueTypeRef.ElementTypeRef;
foreach (var item in valueTypeRefArray)
{
if (item == null)
{
if (receivingElementTypeRef.IsValueType)
{
return false;
}
else
{
continue;
}
}
if (!receivingElementTypeRef.IsAssignableFrom(item))
{
return false;
}
}
continue;
}
}
return true;
}