1- using System . Globalization ;
21using System . Reflection ;
32using System . Runtime . CompilerServices ;
43using System . Text ;
@@ -25,6 +24,7 @@ internal abstract class TraceLogWriter
2524 new JsonStringEnumConverter ( ) ,
2625 new ResourceTypeInTraceJsonConverter ( ) ,
2726 new ResourceFieldInTraceJsonConverterFactory ( ) ,
27+ new AbstractResourceWrapperInTraceJsonConverterFactory ( ) ,
2828 new IdentifiableInTraceJsonConverter ( )
2929 }
3030 } ;
@@ -51,11 +51,8 @@ public override bool CanConvert(Type typeToConvert)
5151
5252 public override JsonConverter CreateConverter ( Type typeToConvert , JsonSerializerOptions options )
5353 {
54- Type objectType = typeof ( ResourceFieldInTraceJsonConverter < > ) ;
55- Type converterType = objectType . MakeGenericType ( typeToConvert ) ;
56-
57- return ( JsonConverter ) Activator . CreateInstance ( converterType , BindingFlags . Instance | BindingFlags . Public , null , null ,
58- CultureInfo . InvariantCulture ) ! ;
54+ Type converterType = typeof ( ResourceFieldInTraceJsonConverter < > ) . MakeGenericType ( typeToConvert ) ;
55+ return ( JsonConverter ) Activator . CreateInstance ( converterType ) ! ;
5956 }
6057
6158 private sealed class ResourceFieldInTraceJsonConverter < TField > : JsonConverter < TField >
@@ -82,10 +79,43 @@ public override IIdentifiable Read(ref Utf8JsonReader reader, Type typeToConvert
8279
8380 public override void Write ( Utf8JsonWriter writer , IIdentifiable value , JsonSerializerOptions options )
8481 {
82+ // Intentionally *not* calling GetClrType() because we need delegation to the wrapper converter.
8583 Type runtimeType = value . GetType ( ) ;
84+
8685 JsonSerializer . Serialize ( writer , value , runtimeType , options ) ;
8786 }
8887 }
88+
89+ private sealed class AbstractResourceWrapperInTraceJsonConverterFactory : JsonConverterFactory
90+ {
91+ public override bool CanConvert ( Type typeToConvert )
92+ {
93+ return typeToConvert . IsAssignableTo ( typeof ( IAbstractResourceWrapper ) ) ;
94+ }
95+
96+ public override JsonConverter CreateConverter ( Type typeToConvert , JsonSerializerOptions options )
97+ {
98+ Type converterType = typeof ( AbstractResourceWrapperInTraceJsonConverter < > ) . MakeGenericType ( typeToConvert ) ;
99+ return ( JsonConverter ) Activator . CreateInstance ( converterType ) ! ;
100+ }
101+
102+ private sealed class AbstractResourceWrapperInTraceJsonConverter < TWrapper > : JsonConverter < TWrapper >
103+ where TWrapper : IAbstractResourceWrapper
104+ {
105+ public override TWrapper Read ( ref Utf8JsonReader reader , Type typeToConvert , JsonSerializerOptions options )
106+ {
107+ throw new NotSupportedException ( ) ;
108+ }
109+
110+ public override void Write ( Utf8JsonWriter writer , TWrapper value , JsonSerializerOptions options )
111+ {
112+ writer . WriteStartObject ( ) ;
113+ writer . WriteString ( "ClrType" , value . AbstractType . FullName ) ;
114+ writer . WriteString ( "StringId" , value . StringId ) ;
115+ writer . WriteEndObject ( ) ;
116+ }
117+ }
118+ }
89119}
90120
91121internal sealed class TraceLogWriter < T > : TraceLogWriter
0 commit comments