11// Copyright (c) Microsoft Corporation. All rights reserved.
22// Licensed under the MIT license.
3-
43using System ;
4+ using System . Collections . Concurrent ;
55using System . Diagnostics . CodeAnalysis ;
66using System . Reflection ;
77using Microsoft . OpenApi . Attributes ;
@@ -13,6 +13,8 @@ namespace Microsoft.OpenApi.Extensions
1313 /// </summary>
1414 public static class StringExtensions
1515 {
16+ private static readonly ConcurrentDictionary < Type , ConcurrentDictionary < string , object > > EnumDisplayCache = new ( ) ;
17+
1618 /// <summary>
1719 /// Gets the enum value based on the given enum type and display name.
1820 /// </summary>
@@ -21,22 +23,28 @@ public static class StringExtensions
2123 {
2224 var type = typeof ( T ) ;
2325 if ( ! type . IsEnum )
24- {
2526 return default ;
26- }
27+
28+ var displayMap = EnumDisplayCache . GetOrAdd ( type , _ => new ConcurrentDictionary < string , object > ( StringComparer . OrdinalIgnoreCase ) ) ;
29+
30+ if ( displayMap . TryGetValue ( displayName , out var cachedValue ) )
31+ return ( T ) cachedValue ;
32+
2733
2834 foreach ( var field in type . GetFields ( BindingFlags . Public | BindingFlags . Static ) )
2935 {
30- var displayAttribute = ( DisplayAttribute ) field . GetCustomAttribute ( typeof ( DisplayAttribute ) ) ;
31- if ( displayAttribute != null && displayAttribute . Name == displayName )
36+ var displayAttribute = field . GetCustomAttribute < DisplayAttribute > ( ) ;
37+ if ( displayAttribute != null && displayAttribute . Name . Equals ( displayName , StringComparison . OrdinalIgnoreCase ) )
3238 {
33- return ( T ) field . GetValue ( null ) ;
39+ var enumValue = ( T ) field . GetValue ( null ) ;
40+ displayMap . TryAdd ( displayName , enumValue ) ;
41+ return enumValue ;
3442 }
3543 }
3644
3745 return default ;
3846 }
3947 internal static string ToFirstCharacterLowerCase ( this string input )
40- => string . IsNullOrEmpty ( input ) ? string . Empty : char . ToLowerInvariant ( input [ 0 ] ) + input . Substring ( 1 ) ;
48+ => string . IsNullOrEmpty ( input ) ? string . Empty : char . ToLowerInvariant ( input [ 0 ] ) + input . Substring ( 1 ) ;
4149 }
4250}
0 commit comments