@@ -6,15 +6,14 @@ open FSharp.Reflection
66open System.Reflection .Emit
77open System.Text .Json
88
9- type internal Serializer < 'Record > = delegate of Utf8JsonWriter * 'Record * JsonSerializerOptions -> unit
10- type internal FieldReader < 'Record , 'Field > = delegate of 'Record -> 'Field
9+ type internal Serializer = Action< Utf8JsonWriter, obj, JsonSerializerOptions>
1110
1211type internal RecordField < 'Record > =
1312 {
1413 Name: string
1514 Type: Type
1615 Ignore: bool
17- Serialize: Serializer < 'Record >
16+ Serialize: Serializer
1817 }
1918
2019 static member name ( p : PropertyInfo ) =
@@ -39,15 +38,17 @@ type internal RecordField<'Record> =
3938 )
4039 let gen = dynMethod.GetILGenerator()
4140 gen.Emit( OpCodes.Ldarg_ 0)
41+ if f.DeclaringType.IsValueType then
42+ gen.Emit( OpCodes.Unbox, typeof< 'Record>)
4243 gen.Emit( OpCodes.Ldfld, f)
4344 gen.Emit( OpCodes.Ret)
44- dynMethod.CreateDelegate( typeof< FieldReader < 'Record , 'Field>>) :?> FieldReader < 'Record , 'Field>
45- Serializer< 'Record > (fun writer r options ->
45+ dynMethod.CreateDelegate( typeof< Func < obj , 'Field>>) :?> Func < obj , 'Field>
46+ Serializer( fun writer r options ->
4647 let v = getter.Invoke( r)
4748 JsonSerializer.Serialize< 'Field>( writer, v, options)
4849 )
4950
50- static member properties () =
51+ static member fields () =
5152 let recordTy = typeof< 'Record>
5253 let fields = recordTy.GetFields( BindingFlags.Instance ||| BindingFlags.NonPublic)
5354 let props = FSharpType.GetRecordFields( recordTy, true )
@@ -57,7 +58,7 @@ type internal RecordField<'Record> =
5758 typeof< RecordField< 'Record>>. GetMethod( " serializer" , BindingFlags.Static ||| BindingFlags.NonPublic)
5859 .MakeGenericMethod( p.PropertyType)
5960 .Invoke( null , [| f|])
60- :?> Serializer< 'Record >
61+ :?> Serializer
6162 {
6263 Name = RecordField< 'Record>. name p
6364 Type = p.PropertyType
0 commit comments