[fix]GetNext
大石头 编写于 2024-06-25 16:49:36
X
#if NET7_0_OR_GREATER
using System.Reflection;
using System.Runtime.Serialization;
using System.Text.Json;
using System.Text.Json.Serialization.Metadata;
using System.Xml.Serialization;

namespace NewLife.Serialization;

/// <summary>数据成员解析器。让System.Text.Json增加对DataMemberAttribute和IgnoreDataMemberAttribute的支持</summary>
public class DataMemberResolver : DefaultJsonTypeInfoResolver
{
    /// <summary>默认解析器实例</summary>
    public static DataMemberResolver Default { get; } = new DataMemberResolver();

    /// <summary>获取类型信息</summary>
    /// <param name="type"></param>
    /// <param name="options"></param>
    /// <returns></returns>
    public override JsonTypeInfo GetTypeInfo(Type type, JsonSerializerOptions options)
    {
        var typeInfo = base.GetTypeInfo(type, options);

        if (typeInfo.Kind == JsonTypeInfoKind.Object && !type.IsArray)
        {
            Modifier(typeInfo);
        }

        return typeInfo;
    }

    /// <summary>检测并修改成员信息</summary>
    /// <param name="typeInfo"></param>
    public static void Modifier(JsonTypeInfo typeInfo)
    {
        if (typeInfo.Kind != JsonTypeInfoKind.Object) return;

        foreach (var propertyInfo in typeInfo.Properties)
        {
            var provider = propertyInfo.AttributeProvider;
            if (provider == null) continue;

            if (provider.IsDefined(typeof(IgnoreDataMemberAttribute), true) ||
                provider.IsDefined(typeof(XmlIgnoreAttribute), false))
            {
                // 禁用
                propertyInfo.Get = null;
                propertyInfo.Set = null;
            }
            else
            {
                var attr = provider.GetCustomAttributes(typeof(DataMemberAttribute), false)?.FirstOrDefault() as DataMemberAttribute;
                if (attr != null && !attr.Name.IsNullOrEmpty())
                    propertyInfo.Name = attr.Name;
            }
        }
    }
}
#endif