using System.Reflection; using Core.Models.Spt.Repeatable; namespace Core.Utils.Extensions { public static class ObjectExtensions { private static readonly Dictionary> _indexedProperties = new(); private static readonly object _indexedPropertiesLockObject = new(); private static bool TryGetCachedProperty(Type type, string key, out PropertyInfo cachedProperty) { lock (_indexedPropertiesLockObject) { if (!_indexedProperties.TryGetValue(type, out var properties)) { properties = type.GetProperties().ToDictionary(prop => prop.GetJsonName(), prop => prop); _indexedProperties.Add(type, properties); } return properties.TryGetValue(key, out cachedProperty); } } public static bool Contains(this object obj, T key) { return TryGetCachedProperty(obj.GetType(), key.ToString(), out _); } public static T? Get(this object obj, string toLower) { if (!TryGetCachedProperty(obj.GetType(), toLower, out var cachedProperty)) return default; return (T?)cachedProperty.GetValue(obj); } public static void Remove(this EliminationTargetPool pool, T key) { // TODO: extension method should be moved to a separate static class and deal with logic } } }