public bool IsSatisfiedBy()

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;
        }