diff --git a/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs b/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs index 46d2c202b032fcc14ff6aebd3e184bb45162c08c..def15e9b1c9f4bcf45f4d650fd0e529273ed51eb 100644 --- a/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs +++ b/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs @@ -30,6 +30,7 @@ */ using System; +using System.Collections.Concurrent; using System.Reflection; using System.Text.RegularExpressions; using TUGraz.VectoCommon.Utils; @@ -473,6 +474,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Data public static class ModalResultFieldExtensionMethods { + private static ConcurrentDictionary<ModalResultField, ModalResultFieldAttribute> _attributeDictionary = + new ConcurrentDictionary<ModalResultField, ModalResultFieldAttribute>(); public static string GetName(this ModalResultField field) { return GetAttribute(field).Name ?? field.ToString(); @@ -480,7 +483,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Data public static string GetCaption(this ModalResultField field) { - return GetAttribute(field).Caption ?? GetAttribute(field).Name ?? field.ToString(); + var attribute = GetAttribute(field); + return attribute.Caption ?? attribute.Name ?? field.ToString(); } public static string GetShortCaption(this ModalResultField field) @@ -496,7 +500,14 @@ namespace TUGraz.VectoCore.Models.Simulation.Data public static ModalResultFieldAttribute GetAttribute(this ModalResultField field) { - return (ModalResultFieldAttribute)Attribute.GetCustomAttribute(ForValue(field), typeof(ModalResultFieldAttribute)); + var attributeCached = _attributeDictionary.TryGetValue(field, out var attribute); + if (attributeCached) { + return attribute; + } else { + attribute = (ModalResultFieldAttribute)Attribute.GetCustomAttribute(ForValue(field), typeof(ModalResultFieldAttribute)); + _attributeDictionary.TryAdd(field, attribute); + } + return attribute; } private static MemberInfo ForValue(ModalResultField field)