98 lines
3.4 KiB
C#
98 lines
3.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Reflection;
|
|
using Newtonsoft.Json;
|
|
using Newtonsoft.Json.Serialization;
|
|
|
|
namespace Needle.Engine.Samples.Helpers
|
|
{
|
|
public class PropertyRenameAndIgnoreSerializerContractResolver : DefaultContractResolver
|
|
{
|
|
private readonly Dictionary<Type, HashSet<string>> _ignores;
|
|
private readonly Dictionary<Type, Dictionary<string, string>> _renames;
|
|
|
|
public PropertyRenameAndIgnoreSerializerContractResolver()
|
|
{
|
|
_ignores = new Dictionary<Type, HashSet<string>>();
|
|
_renames = new Dictionary<Type, Dictionary<string, string>>();
|
|
}
|
|
|
|
|
|
public void IgnoreAllObsolete(Type type)
|
|
{
|
|
const BindingFlags flags = BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Static |
|
|
BindingFlags.NonPublic |
|
|
BindingFlags.Public;
|
|
foreach (var member in type.GetMembers(flags))
|
|
{
|
|
if (member.GetCustomAttribute<ObsoleteAttribute>() != null) continue;
|
|
var name = member.Name;
|
|
if (name.StartsWith("get_"))
|
|
name = name.Substring("get_".Length);
|
|
else if (name.StartsWith("set_"))
|
|
name = name.Substring("set_".Length);
|
|
// Debug.Log("Ignore obsolete " + type.Name + "." + name);
|
|
IgnoreProperty(type, name);
|
|
}
|
|
}
|
|
|
|
public void IgnoreProperty(Type type, params string[] jsonPropertyNames)
|
|
{
|
|
if (!_ignores.ContainsKey(type))
|
|
_ignores[type] = new HashSet<string>();
|
|
|
|
foreach (var prop in jsonPropertyNames)
|
|
{
|
|
var set = _ignores[type];
|
|
if (!set.Contains(prop))
|
|
set.Add(prop);
|
|
}
|
|
}
|
|
|
|
public void RenameProperty(Type type, string propertyName, string newJsonPropertyName)
|
|
{
|
|
if (!_renames.ContainsKey(type))
|
|
_renames[type] = new Dictionary<string, string>();
|
|
|
|
_renames[type][propertyName] = newJsonPropertyName;
|
|
}
|
|
|
|
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
|
|
{
|
|
var property = base.CreateProperty(member, memberSerialization);
|
|
|
|
if (IsIgnored(property.DeclaringType, property.PropertyName))
|
|
{
|
|
property.ShouldSerialize = i => false;
|
|
property.Ignored = true;
|
|
}
|
|
|
|
if (IsRenamed(property.DeclaringType, property.PropertyName, out var newJsonPropertyName))
|
|
property.PropertyName = newJsonPropertyName;
|
|
|
|
return property;
|
|
}
|
|
|
|
private bool IsIgnored(Type type, string jsonPropertyName)
|
|
{
|
|
if (!_ignores.ContainsKey(type))
|
|
return false;
|
|
|
|
return _ignores[type].Contains(jsonPropertyName);
|
|
}
|
|
|
|
private bool IsRenamed(Type type, string jsonPropertyName, out string newJsonPropertyName)
|
|
{
|
|
Dictionary<string, string> renames;
|
|
|
|
if (!_renames.TryGetValue(type, out renames) ||
|
|
!renames.TryGetValue(jsonPropertyName, out newJsonPropertyName))
|
|
{
|
|
newJsonPropertyName = null;
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
} |