2024-10-22 09:28:58 +08:00

154 lines
4.3 KiB
C#

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<T>(this IExtendableObject extendableObject, string name, bool handleType = false)
{
return extendableObject.GetData<T>(
name,
handleType
? new JsonSerializer { TypeNameHandling = TypeNameHandling.All }
: JsonSerializer.CreateDefault()
);
}
public static T GetData<T>(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<T>();
}
else
{
return (T)prop.ToObject(typeof(T), jsonSerializer ?? JsonSerializer.CreateDefault());
}
}
public static void SetData<T>(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<T>(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<T>.Default.Equals(value, default(T)))
{
return;
}
extendableObject.ExtensionData = "{}";
}
var json = JObject.Parse(extendableObject.ExtensionData);
if (value == null || EqualityComparer<T>.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;
}
}
}