using System; using System.Collections.Generic; using MLEM.Misc; using Newtonsoft.Json; namespace MLEM.Data.Json { /// /// An represents an object that can hold generic key-value based data. /// This class uses for each object stored to ensure that objects with a custom get deserialized as an instance of their original type if is not set to . /// Note that, using , adding instances directly is also possible. /// #if NET7_0_OR_GREATER [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("The native code for instantiation of JsonTypeSafeWrapper instances might not be available at runtime.")] #endif public class JsonTypeSafeGenericDataHolder : IGenericDataHolder { private static readonly string[] EmptyStrings = new string[0]; [JsonProperty] private Dictionary data; /// [Obsolete("This method will be removed in a future update in favor of the generic SetData.")] public void SetData(string key, object data) { this.SetData(key, data); } /// public void SetData(string key, T data) { if (EqualityComparer.Default.Equals(data, default)) { if (this.data != null) this.data.Remove(key); } else { if (this.data == null) this.data = new Dictionary(); this.data[key] = JsonTypeSafeWrapper.Of(data); } } /// public T GetData(string key) { if (this.data != null && this.data.TryGetValue(key, out var val)) return (T) val.Value; return default; } /// public IEnumerable GetDataKeys() { if (this.data == null) return JsonTypeSafeGenericDataHolder.EmptyStrings; return this.data.Keys; } } }