mh_frame_sps/APT.Infrastructure.Core/Structs/JsonContractResolver.cs
2026-04-07 13:47:52 +08:00

82 lines
2.3 KiB
C#

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace APT.Infrastructure.Core
{
public class JsonContractResolver : DefaultContractResolver
{
protected override IValueProvider CreateMemberValueProvider(MemberInfo member)
{
return new JsonExpressionValueProvider(member);
}
protected override JsonProperty CreatePropertyFromConstructorParameter(JsonProperty matchingMemberProperty, ParameterInfo parameterInfo)
{
var temp = base.CreatePropertyFromConstructorParameter(matchingMemberProperty, parameterInfo);
if (temp.PropertyType.GetUnNullableType() == typeof(Guid) ||
temp.PropertyType.GetUnNullableType() == typeof(DateTime))
temp.NullValueHandling = NullValueHandling.Include;
return temp;
}
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var temp = base.CreateProperty(member, memberSerialization);
if (temp.PropertyType.GetUnNullableType() == typeof(Guid) ||
temp.PropertyType.GetUnNullableType() == typeof(DateTime))
temp.NullValueHandling = NullValueHandling.Include;
return temp;
}
}
public class JsonExpressionValueProvider : ExpressionValueProvider, IValueProvider
{
private readonly MemberInfo _memberInfo;
public JsonExpressionValueProvider(MemberInfo memberInfo):base(memberInfo)
{
_memberInfo = memberInfo;
}
protected virtual object GetValueByType(Type type)
{
object obj = null;
if (type == typeof(decimal))
obj = decimal.Zero;
else if (type == typeof(int))
obj = 0;
else if (type == typeof(byte))
obj = byte.MinValue;
else if (type == typeof(bool))
obj = false;
else if (type == typeof(double))
obj = (double)0;
return obj;
}
public new object GetValue(object target)
{
object obj = base.GetValue(target);
if (obj == null)
{
Type realType = null;
PropertyInfo propertyInfo = _memberInfo as PropertyInfo;
if (propertyInfo != null)
realType = propertyInfo.PropertyType.GetUnNullableType();
FieldInfo fieldInfo = _memberInfo as FieldInfo;
if (fieldInfo != null)
realType = fieldInfo.FieldType.GetUnNullableType();
if (realType != null)
obj = this.GetValueByType(realType);
}
return obj;
}
}
}