using JiShe.CollectBus.EntityFrameworkCore.Entities; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; using JetBrains.Annotations; using JiShe.CollectBus.Common.Helpers; using Newtonsoft.Json.Linq; using Formatting = Newtonsoft.Json.Formatting; namespace JiShe.CollectBus.EntityFrameworkCore.Extensions { public static class ExtendableObjectExtensions { public static T GetData(this IExtendableObject extendableObject, string name, bool handleType = false) { return extendableObject.GetData( name, handleType ? new JsonSerializer { TypeNameHandling = TypeNameHandling.All } : JsonSerializer.CreateDefault() ); } public static T GetData(this IExtendableObject extendableObject, string name, JsonSerializer? jsonSerializer) { if (extendableObject.ExtensionData == null) { return default(T); } var json = JObject.Parse(extendableObject.ExtensionData); var prop = json[name]; if (prop == null) { return default(T); } if (TypeHelper.IsPrimitiveExtendedIncludingNullable(typeof(T))) { return prop.Value(); } else { return (T)prop.ToObject(typeof(T), jsonSerializer ?? JsonSerializer.CreateDefault()); } } public static void SetData(this IExtendableObject extendableObject, string name, T? value, bool handleType = false) { extendableObject.SetData( name, value, handleType ? new JsonSerializer { TypeNameHandling = TypeNameHandling.All } : JsonSerializer.CreateDefault() ); } public static void SetData(this IExtendableObject extendableObject, string name, T? value, JsonSerializer? jsonSerializer) { if (extendableObject == null) { throw new ArgumentNullException(nameof(extendableObject)); } if (name == null) { throw new ArgumentNullException(nameof(name)); } if (jsonSerializer == null) { jsonSerializer = JsonSerializer.CreateDefault(); } if (extendableObject.ExtensionData == null) { if (EqualityComparer.Default.Equals(value, default(T))) { return; } extendableObject.ExtensionData = "{}"; } var json = JObject.Parse(extendableObject.ExtensionData); if (value == null || EqualityComparer.Default.Equals(value, default(T))) { if (json[name] != null) { json.Remove(name); } } else if (TypeHelper.IsPrimitiveExtendedIncludingNullable(value.GetType())) { json[name] = new JValue(value); } else { json[name] = JToken.FromObject(value, jsonSerializer); } var data = json.ToString(Formatting.None); if (data == "{}") { data = null; } extendableObject.ExtensionData = data; } public static bool RemoveData(this IExtendableObject extendableObject, string name) { if (extendableObject == null) { throw new ArgumentNullException(nameof(extendableObject)); } if (extendableObject.ExtensionData == null) { return false; } var json = JObject.Parse(extendableObject.ExtensionData); var token = json[name]; if (token == null) { return false; } json.Remove(name); var data = json.ToString(Formatting.None); if (data == "{}") { data = null; } extendableObject.ExtensionData = data; return true; } } }