131 lines
3.7 KiB
C#
131 lines
3.7 KiB
C#
using Newtonsoft.Json.Serialization;
|
||
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Reflection;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
|
||
namespace LiveForum.Code.JsonConverterExtend;
|
||
|
||
public class CustomContractResolverf : CamelCasePropertyNamesContractResolver
|
||
{
|
||
protected override IValueProvider CreateMemberValueProvider(MemberInfo member)
|
||
{
|
||
var valueProvider = base.CreateMemberValueProvider(member);
|
||
|
||
if (member is PropertyInfo property)
|
||
{
|
||
// 处理字符串属性
|
||
if (IsStringType(property.PropertyType))
|
||
{
|
||
return new StringValueProvider(valueProvider);
|
||
}
|
||
|
||
// 处理可空值类型(DateTime?, int?, bool? 等)
|
||
if (IsNullableValueType(property.PropertyType))
|
||
{
|
||
return new NullableValueTypeProvider(valueProvider);
|
||
}
|
||
}
|
||
|
||
return valueProvider;
|
||
}
|
||
|
||
private bool IsStringType(Type type)
|
||
{
|
||
return type == typeof(string) ||
|
||
(type.IsGenericType &&
|
||
type.GetGenericTypeDefinition() == typeof(Nullable<>) &&
|
||
type.GetGenericArguments()[0] == typeof(string));
|
||
}
|
||
|
||
private bool IsNullableValueType(Type type)
|
||
{
|
||
return type.IsGenericType &&
|
||
type.GetGenericTypeDefinition() == typeof(Nullable<>);
|
||
}
|
||
|
||
private class StringValueProvider : IValueProvider
|
||
{
|
||
private readonly IValueProvider _innerProvider;
|
||
|
||
public StringValueProvider(IValueProvider innerProvider)
|
||
{
|
||
_innerProvider = innerProvider;
|
||
}
|
||
|
||
public void SetValue(object target, object value)
|
||
{
|
||
_innerProvider.SetValue(target, value);
|
||
}
|
||
|
||
public object GetValue(object target)
|
||
{
|
||
var value = _innerProvider.GetValue(target);
|
||
return value ?? string.Empty;
|
||
}
|
||
}
|
||
|
||
private class NullableValueTypeProvider : IValueProvider
|
||
{
|
||
private readonly IValueProvider _innerProvider;
|
||
|
||
public NullableValueTypeProvider(IValueProvider innerProvider)
|
||
{
|
||
_innerProvider = innerProvider;
|
||
}
|
||
|
||
public void SetValue(object target, object value)
|
||
{
|
||
_innerProvider.SetValue(target, value);
|
||
}
|
||
|
||
public object GetValue(object target)
|
||
{
|
||
var value = _innerProvider.GetValue(target);
|
||
return value ?? string.Empty;
|
||
}
|
||
}
|
||
}
|
||
public class CustomContractResolver : CamelCasePropertyNamesContractResolver
|
||
{
|
||
protected override IValueProvider CreateMemberValueProvider(MemberInfo member)
|
||
{
|
||
var valueProvider = base.CreateMemberValueProvider(member);
|
||
|
||
// 处理字符串属性(包括可空字符串)
|
||
if (member is PropertyInfo property &&
|
||
(property.PropertyType == typeof(string) ||
|
||
(property.PropertyType.IsGenericType &&
|
||
property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) &&
|
||
property.PropertyType.GetGenericArguments()[0] == typeof(string))))
|
||
{
|
||
return new StringValueProvider(valueProvider);
|
||
}
|
||
|
||
return valueProvider;
|
||
}
|
||
|
||
private class StringValueProvider : IValueProvider
|
||
{
|
||
private readonly IValueProvider _innerProvider;
|
||
|
||
public StringValueProvider(IValueProvider innerProvider)
|
||
{
|
||
_innerProvider = innerProvider;
|
||
}
|
||
|
||
public void SetValue(object target, object value)
|
||
{
|
||
_innerProvider.SetValue(target, value);
|
||
}
|
||
|
||
public object GetValue(object target)
|
||
{
|
||
var value = _innerProvider.GetValue(target);
|
||
return value ?? string.Empty;
|
||
}
|
||
}
|
||
} |