private void ConfigureDictionaryBoundAttribute( BoundAttributeDescriptorBuilder builder, IPropertySymbol property, INamedTypeSymbol containingType, AttributeData attributeNameAttribute, string attributeName, bool hasPublicSetter) { string dictionaryAttributePrefix = null; var dictionaryAttributePrefixSet = false; if (attributeNameAttribute != null) { foreach (var argument in attributeNameAttribute.NamedArguments) { if (argument.Key == TagHelperTypes.HtmlAttributeName.DictionaryAttributePrefix) { dictionaryAttributePrefix = (string)argument.Value.Value; dictionaryAttributePrefixSet = true; break; } } } var dictionaryArgumentTypes = GetDictionaryArgumentTypes(property); if (dictionaryArgumentTypes != null) { var prefix = dictionaryAttributePrefix; if (attributeNameAttribute == null || !dictionaryAttributePrefixSet) { prefix = attributeName + "-"; } if (prefix != null) { var dictionaryValueType = dictionaryArgumentTypes[1]; var dictionaryValueTypeName = GetFullName(dictionaryValueType); builder.AsDictionary(prefix, dictionaryValueTypeName); } } var dictionaryKeyType = dictionaryArgumentTypes?[0]; if (dictionaryKeyType?.SpecialType != SpecialType.System_String) { if (dictionaryAttributePrefix != null) { // DictionaryAttributePrefix is not supported unless associated with an // IDictionary<string, TValue> property. var diagnostic = RazorDiagnosticFactory.CreateTagHelper_InvalidAttributePrefixNotNull(GetFullName(containingType), property.Name); builder.Diagnostics.Add(diagnostic); } return; } else if (!hasPublicSetter && attributeNameAttribute != null && !dictionaryAttributePrefixSet) { // Must set DictionaryAttributePrefix when using HtmlAttributeNameAttribute with a dictionary property // that lacks a public setter. var diagnostic = RazorDiagnosticFactory.CreateTagHelper_InvalidAttributePrefixNull(GetFullName(containingType), property.Name); builder.Diagnostics.Add(diagnostic); return; } }