|
1 | 1 | namespace FsCodec.SystemTextJson
|
2 | 2 |
|
3 |
| -open System |
4 |
| -open System.Linq.Expressions |
5 | 3 | open System.Text.Json.Serialization
|
6 | 4 |
|
7 |
| -type internal ConverterActivator = delegate of unit -> JsonConverter |
8 |
| - |
9 | 5 | type UnionOrTypeSafeEnumConverterFactory(typeSafeEnum, union) =
|
10 | 6 | inherit JsonConverterFactory()
|
11 | 7 |
|
12 |
| - static let hasConverterAttribute = memoize (fun (t: Type) -> t.IsDefined(typeof<JsonConverterAttribute>, true)) |
| 8 | + static let hasConverterAttribute = memoize (fun (t: System.Type) -> t.IsDefined(typeof<JsonConverterAttribute>, true)) |
13 | 9 |
|
14 |
| - override _.CanConvert(t: Type) = |
15 |
| - not (t.IsGenericType && let gtd = t.GetGenericTypeDefinition() in gtd = typedefof<option<_>> || gtd = typedefof<list<_>>) |
| 10 | + override _.CanConvert t = |
| 11 | + not (t.IsGenericType && let g = t.GetGenericTypeDefinition() in g = typedefof<option<_>> || g = typedefof<list<_>>) |
16 | 12 | && FsCodec.Union.isUnion t
|
17 | 13 | && not (hasConverterAttribute t)
|
18 | 14 | && ((typeSafeEnum && union)
|
19 | 15 | || typeSafeEnum = FsCodec.Union.isNullary t)
|
20 | 16 |
|
21 | 17 | override _.CreateConverter(t, _options) =
|
22 | 18 | let openConverterType = if FsCodec.Union.isNullary t then typedefof<TypeSafeEnumConverter<_>> else typedefof<UnionConverter<_>>
|
23 |
| - let constructor = openConverterType.MakeGenericType(t).GetConstructors() |> Array.head |
24 |
| - let newExpression = Expression.New(constructor) |
25 |
| - let lambda = Expression.Lambda(typeof<ConverterActivator>, newExpression) |
26 |
| - |
27 |
| - let activator = lambda.Compile() :?> ConverterActivator |
28 |
| - activator.Invoke() |
| 19 | + openConverterType.MakeGenericType(t).GetConstructors().[0].Invoke[||] :?> _ |
0 commit comments