如何在System.Text.Json契约修改器中读取JsonPropertyInfo的DeclaringType?
无需反射获取JsonPropertyInfo的DeclaringType方法
在System.Text.Json的类型系统中,虽然JsonPropertyInfo本身未直接公开DeclaringType,但可通过其公开的UnderlyingProperty属性间接获取目标信息:
- 先检查
JsonPropertyInfo.UnderlyingProperty是否非空——该属性对应定义当前属性的反射PropertyInfo对象 - 通过
PropertyInfo.DeclaringType即可拿到属性的声明类型
基于你提供的示例代码,修改后的实现如下:
// 自定义修改器:获取属性的声明类型 static void GetDeclaringTypeModifier(JsonTypeInfo typeInfo) { foreach (JsonPropertyInfo propertyInfo in typeInfo.Properties) { // 获取对应CLR属性的反射信息 var underlyingProp = propertyInfo.UnderlyingProperty; if (underlyingProp != null) { Type declaringType = underlyingProp.DeclaringType; // 此处可基于declaringType实现自定义序列化逻辑 Console.WriteLine($"属性 {propertyInfo.Name} 的声明类型: {declaringType?.FullName}"); } } }
注意事项
UnderlyingProperty仅在属性基于CLR实体类属性定义时才有值,若为手动创建的动态JsonPropertyInfo(无对应CLR属性),该属性会返回null,这类场景需单独处理,但常规实体序列化场景完全适用。- 该方法仅支持.NET 6及以上版本的System.Text.Json,因为
UnderlyingProperty是.NET 6中新增的公开属性。
内容的提问来源于stack exchange,提问作者Ilya Chernomordik
相关产品推荐
相关产品推荐

