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