live-forum/server/webapi/LiveForum/LiveForum.Code/JsonConverterExtend/CustomContractResolver.cs
2026-03-24 11:27:37 +08:00

131 lines
3.7 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}
}