#if NET7_0_OR_GREATER
using System.Diagnostics.CodeAnalysis;
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>
[UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "继承默认解析器以叠加 [DataMember] 成员映射;解析依赖反射元数据,属动态能力边界,元数据由 SystemJson 上下文或调用方负责保留")]
[UnconditionalSuppressMessage("AOT", "IL3050", Justification = "继承默认解析器以叠加 [DataMember] 成员映射;解析依赖反射元数据,属动态能力边界,元数据由 SystemJson 上下文或调用方负责保留")]
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 if (provider is PropertyInfo pi)
{
var name = SerialHelper.GetName(pi);
if (name != pi.Name) propertyInfo.Name = name;
}
}
}
}
#endif
|