using System.Collections.Generic; using System.Runtime.Serialization; 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 . /// [DataContract] #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]; [DataMember(EmitDefaultValue = false)] private Dictionary data; /// public void SetData(string key, object data) { if (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; } } }