private static TagHelperAttributeDescriptor ToIndexerAttributeDescriptor( PropertyInfo property, HtmlAttributeNameAttribute attributeNameAttribute, Type parentType, ErrorSink errorSink, string defaultPrefix, bool designTime, out bool isInvalid) { isInvalid = false; var hasPublicSetter = property.SetMethod?.IsPublic == true; var dictionaryTypeArguments = ClosedGenericMatcher.ExtractGenericInterface( property.PropertyType, typeof(IDictionary<,>)) ?.GenericTypeArguments; if (dictionaryTypeArguments?[0] != typeof(string)) { if (attributeNameAttribute?.DictionaryAttributePrefix != null) { // DictionaryAttributePrefix is not supported unless associated with an // IDictionary<string, TValue> property. isInvalid = true; errorSink.OnError( SourceLocation.Zero, Resources.FormatTagHelperDescriptorFactory_InvalidAttributePrefixNotNull( parentType.FullName, property.Name, nameof(HtmlAttributeNameAttribute), nameof(HtmlAttributeNameAttribute.DictionaryAttributePrefix), "IDictionary<string, TValue>")); } else if (attributeNameAttribute != null && !hasPublicSetter) { // Associated an HtmlAttributeNameAttribute with a non-dictionary property that lacks a public // setter. isInvalid = true; errorSink.OnError( SourceLocation.Zero, Resources.FormatTagHelperDescriptorFactory_InvalidAttributeNameAttribute( parentType.FullName, property.Name, nameof(HtmlAttributeNameAttribute), "IDictionary<string, TValue>")); } return null; } else if (!hasPublicSetter && attributeNameAttribute != null && !attributeNameAttribute.DictionaryAttributePrefixSet) { // Must set DictionaryAttributePrefix when using HtmlAttributeNameAttribute with a dictionary property // that lacks a public setter. isInvalid = true; errorSink.OnError( SourceLocation.Zero, Resources.FormatTagHelperDescriptorFactory_InvalidAttributePrefixNull( parentType.FullName, property.Name, nameof(HtmlAttributeNameAttribute), nameof(HtmlAttributeNameAttribute.DictionaryAttributePrefix), "IDictionary<string, TValue>")); return null; } // Potential prefix case. Use default prefix (based on name)? var useDefault = attributeNameAttribute == null || !attributeNameAttribute.DictionaryAttributePrefixSet; var prefix = useDefault ? defaultPrefix : attributeNameAttribute.DictionaryAttributePrefix; if (prefix == null) { // DictionaryAttributePrefix explicitly set to null. Ignore. return null; } return ToAttributeDescriptor( property, attributeName: prefix, typeName: dictionaryTypeArguments[1].FullName, isIndexer: true, designTime: designTime); }
private TagHelperAttributeDescriptor ToIndexerAttributeDescriptor( PropertyInfo property, HtmlAttributeNameAttribute attributeNameAttribute, Type parentType, ErrorSink errorSink, string defaultPrefix, out bool isInvalid) { isInvalid = false; var hasPublicSetter = property.SetMethod != null && property.SetMethod.IsPublic; var dictionaryTypeArguments = ClosedGenericMatcher.ExtractGenericInterface( property.PropertyType, typeof(IDictionary<,>)) ?.GenericTypeArguments .Select(type => type.IsGenericParameter ? null : type) .ToArray(); if (dictionaryTypeArguments?[0] != typeof(string)) { if (attributeNameAttribute?.DictionaryAttributePrefix != null) { // DictionaryAttributePrefix is not supported unless associated with an // IDictionary<string, TValue> property. isInvalid = true; errorSink.OnError( SourceLocation.Zero, Resources.FormatTagHelperDescriptorFactory_InvalidAttributePrefixNotNull( parentType.FullName, property.Name, nameof(HtmlAttributeNameAttribute), nameof(HtmlAttributeNameAttribute.DictionaryAttributePrefix), "IDictionary<string, TValue>"), length: 0); } else if (attributeNameAttribute != null && !hasPublicSetter) { // Associated an HtmlAttributeNameAttribute with a non-dictionary property that lacks a public // setter. isInvalid = true; errorSink.OnError( SourceLocation.Zero, Resources.FormatTagHelperDescriptorFactory_InvalidAttributeNameAttribute( parentType.FullName, property.Name, nameof(HtmlAttributeNameAttribute), "IDictionary<string, TValue>"), length: 0); } return null; } else if (!hasPublicSetter && attributeNameAttribute != null && !attributeNameAttribute.DictionaryAttributePrefixSet) { // Must set DictionaryAttributePrefix when using HtmlAttributeNameAttribute with a dictionary property // that lacks a public setter. isInvalid = true; errorSink.OnError( SourceLocation.Zero, Resources.FormatTagHelperDescriptorFactory_InvalidAttributePrefixNull( parentType.FullName, property.Name, nameof(HtmlAttributeNameAttribute), nameof(HtmlAttributeNameAttribute.DictionaryAttributePrefix), "IDictionary<string, TValue>"), length: 0); return null; } // Potential prefix case. Use default prefix (based on name)? var useDefault = attributeNameAttribute == null || !attributeNameAttribute.DictionaryAttributePrefixSet; var prefix = useDefault ? defaultPrefix : attributeNameAttribute.DictionaryAttributePrefix; if (prefix == null) { // DictionaryAttributePrefix explicitly set to null. Ignore. return null; } return ToAttributeDescriptor( property, attributeName: prefix, typeName: dictionaryTypeArguments[1].FullName, isIndexer: true, isStringProperty: typeof(string) == dictionaryTypeArguments[1]); }
private static TagHelperAttributeDescriptor ToAttributeDescriptor( PropertyInfo property, HtmlAttributeNameAttribute attributeNameAttribute) { var attributeName = attributeNameAttribute != null ? attributeNameAttribute.Name : ToHtmlCase(property.Name); return new TagHelperAttributeDescriptor( attributeName, property.Name, property.PropertyType.FullName, isIndexer: false); }
private static TagHelperAttributeDescriptor ToIndexerAttributeDescriptor( PropertyInfo property, HtmlAttributeNameAttribute attributeNameAttribute, Type parentType, ErrorSink errorSink, string defaultPrefix, out bool isInvalid) { isInvalid = false; var dictionaryTypeArguments = ClosedGenericMatcher.ExtractGenericInterface( property.PropertyType, typeof(IDictionary<,>)) ?.GenericTypeArguments; if (dictionaryTypeArguments?[0] != typeof(string)) { if (attributeNameAttribute?.DictionaryAttributePrefix != null) { // DictionaryAttributePrefix is not supported unless associated with an // IDictionary<string, TValue> property. isInvalid = true; errorSink.OnError( SourceLocation.Zero, Resources.FormatTagHelperDescriptorFactory_InvalidAttributePrefix( parentType.FullName, property.Name, nameof(HtmlAttributeNameAttribute), nameof(HtmlAttributeNameAttribute.DictionaryAttributePrefix), "IDictionary<string, TValue>")); } return null; } // Potential prefix case. Use default prefix (based on name)? var useDefault = attributeNameAttribute == null || !attributeNameAttribute.DictionaryAttributePrefixSet; var prefix = useDefault ? defaultPrefix : attributeNameAttribute.DictionaryAttributePrefix; if (prefix == null) { // DictionaryAttributePrefix explicitly set to null. Ignore. return null; } return new TagHelperAttributeDescriptor( name: prefix, propertyName: property.Name, typeName: dictionaryTypeArguments[1].FullName, isIndexer: true); }
private TagHelperAttributeDescriptor ToIndexerAttributeDescriptor( IPropertyInfo property, HtmlAttributeNameAttribute attributeNameAttribute, ITypeInfo parentType, ErrorSink errorSink, string defaultPrefix, out bool isInvalid) { isInvalid = false; var hasPublicSetter = property.HasPublicSetter; var dictionaryTypeArguments = property.PropertyType.GetGenericDictionaryParameters(); if (!StringTypeInfo.Equals(dictionaryTypeArguments?[0])) { if (attributeNameAttribute?.DictionaryAttributePrefix != null) { // DictionaryAttributePrefix is not supported unless associated with an // IDictionary<string, TValue> property. isInvalid = true; errorSink.OnError( SourceLocation.Zero, Resources.FormatTagHelperDescriptorFactory_InvalidAttributePrefixNotNull( parentType.FullName, property.Name, nameof(HtmlAttributeNameAttribute), nameof(HtmlAttributeNameAttribute.DictionaryAttributePrefix), "IDictionary<string, TValue>"), length: 0); } else if (attributeNameAttribute != null && !hasPublicSetter) { // Associated an HtmlAttributeNameAttribute with a non-dictionary property that lacks a public // setter. isInvalid = true; errorSink.OnError( SourceLocation.Zero, Resources.FormatTagHelperDescriptorFactory_InvalidAttributeNameAttribute( parentType.FullName, property.Name, nameof(HtmlAttributeNameAttribute), "IDictionary<string, TValue>"), length: 0); } return null; } else if (!hasPublicSetter && attributeNameAttribute != null && !attributeNameAttribute.DictionaryAttributePrefixSet) { // Must set DictionaryAttributePrefix when using HtmlAttributeNameAttribute with a dictionary property // that lacks a public setter. isInvalid = true; errorSink.OnError( SourceLocation.Zero, Resources.FormatTagHelperDescriptorFactory_InvalidAttributePrefixNull( parentType.FullName, property.Name, nameof(HtmlAttributeNameAttribute), nameof(HtmlAttributeNameAttribute.DictionaryAttributePrefix), "IDictionary<string, TValue>"), length: 0); return null; } // Potential prefix case. Use default prefix (based on name)? var useDefault = attributeNameAttribute == null || !attributeNameAttribute.DictionaryAttributePrefixSet; var prefix = useDefault ? defaultPrefix : attributeNameAttribute.DictionaryAttributePrefix; if (prefix == null) { // DictionaryAttributePrefix explicitly set to null. Ignore. return null; } return ToAttributeDescriptor( property, attributeName: prefix, typeName: dictionaryTypeArguments[1].FullName, isIndexer: true, isStringProperty: StringTypeInfo.Equals(dictionaryTypeArguments[1])); }