// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.ComponentModel; namespace System.Windows.Forms.PropertyGridInternal; internal partial class MergePropertyDescriptor { private class MergedAttributeCollection : AttributeCollection { private readonly MergePropertyDescriptor _owner; private AttributeCollection[]? _attributeCollections; private Dictionary<Type, Attribute>? _foundAttributes; public MergedAttributeCollection(MergePropertyDescriptor owner) : base(attributes: null) { _owner = owner; } public override Attribute? this[[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.PublicFields)] Type attributeType] => GetCommonAttribute(attributeType); private Attribute? GetCommonAttribute([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.PublicFields)] Type attributeType) { if (_attributeCollections is null) { _attributeCollections = new AttributeCollection[_owner._descriptors.Length]; for (int i = 0; i < _owner._descriptors.Length; i++) { _attributeCollections[i] = _owner._descriptors[i].Attributes; } } if (_attributeCollections.Length == 0) { return GetDefaultAttribute(attributeType); } if (_foundAttributes is not null && _foundAttributes.TryGetValue(attributeType, out Attribute? value)) { return value; } value = _attributeCollections[0][attributeType]; if (value is null) { return null; } for (int i = 1; i < _attributeCollections.Length; i++) { Attribute? newValue = _attributeCollections[i][attributeType]; if (!value.Equals(newValue)) { value = GetDefaultAttribute(attributeType); break; } } _foundAttributes ??= []; if (value is not null) { _foundAttributes[attributeType] = value; } return value; } } }