| File: HtmlAttributePropertyHelper.cs | Web Access |
| Project: src\aspnetcore\src\Mvc\Mvc.ViewFeatures\src\Microsoft.AspNetCore.Mvc.ViewFeatures.csproj (Microsoft.AspNetCore.Mvc.ViewFeatures) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Concurrent; using System.Reflection.Metadata; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.Extensions.Internal; [assembly: MetadataUpdateHandler(typeof(HtmlAttributePropertyHelper))] namespace Microsoft.AspNetCore.Mvc.ViewFeatures; internal sealed class HtmlAttributePropertyHelper { private static readonly ConcurrentDictionary<Type, HtmlAttributePropertyHelper[]> ReflectionCache = new ConcurrentDictionary<Type, HtmlAttributePropertyHelper[]>(); private readonly PropertyHelper _propertyHelper; public HtmlAttributePropertyHelper(PropertyHelper propertyHelper) { _propertyHelper = propertyHelper; Name = propertyHelper.Name is string name ? name.Replace('_', '-') : null; } /// <summary> /// Part of <see cref="MetadataUpdateHandlerAttribute"/> contract. /// </summary> public static void ClearCache(Type[] _) { ReflectionCache.Clear(); } public string Name { get; } public static HtmlAttributePropertyHelper[] GetProperties(Type type) { if (!ReflectionCache.TryGetValue(type, out var result)) { var propertyHelpers = PropertyHelper.GetProperties(type, cache: null); result = new HtmlAttributePropertyHelper[propertyHelpers.Length]; for (var i = 0; i < propertyHelpers.Length; i++) { result[i] = new(propertyHelpers[i]); } ReflectionCache[type] = result; } return result; } internal object GetValue(object instance) => _propertyHelper.GetValue(instance); }