@@ -89,10 +89,30 @@ let rec internal compileByType (inputObjectPath: FieldPath) (inputSource : Input
89
89
90
90
| InputObject objDef ->
91
91
let objtype = objDef.Type
92
- let ctor = ReflectionHelper.matchConstructor objtype ( objDef.Fields |> Array.map ( fun x -> x.Name))
92
+ let ( constructor : obj [] -> obj ), ( parameterInfos : Reflection.ParameterInfo []) =
93
+ if typeof< IDictionary< string, obj>>. IsAssignableFrom( objtype) then
94
+ let parameterInfos = [|
95
+ for f in objDef.Fields ->
96
+ { new Reflection.ParameterInfo() with
97
+ member _.Name = f.Name
98
+ member _.ParameterType = f.TypeDef.Type
99
+ member _.Attributes = Reflection.ParameterAttributes.Optional
100
+ }
101
+ |]
102
+ let constructor ( args : obj []) =
103
+ let o = Activator.CreateInstance( objtype)
104
+ let dict = o :?> IDictionary< string, obj>
105
+ for fld, arg in Seq.zip objDef.Fields args do
106
+ dict.Add( fld.Name, arg)
107
+ box o
108
+ constructor, parameterInfos
109
+ else
110
+ let ctor = ReflectionHelper.matchConstructor objtype ( objDef.Fields |> Array.map ( fun x -> x.Name))
111
+ ctor.Invoke, ctor.GetParameters()
112
+
93
113
94
114
let struct ( mapper , nullableMismatchParameters , missingParameters ) =
95
- ctor.GetParameters ()
115
+ parameterInfos
96
116
|> Array.fold (
97
117
fun
98
118
struct( all : ResizeArray < _ >, areNullable : HashSet < _ >, missing : HashSet < _ >)
@@ -170,7 +190,7 @@ let rec internal compileByType (inputObjectPath: FieldPath) (inputSource : Input
170
190
171
191
let! args = argResults |> splitSeqErrorsList
172
192
173
- let instance = ctor.Invoke args
193
+ let instance = constructor args
174
194
do ! objDef.Validator instance
175
195
|> ValidationResult.mapErrors ( fun err -> err |> mapInputObjectError inputSource inputObjectPath originalInputDef)
176
196
return instance
@@ -197,7 +217,7 @@ let rec internal compileByType (inputObjectPath: FieldPath) (inputSource : Input
197
217
198
218
let! args = argResults |> splitSeqErrorsList
199
219
200
- let instance = ctor.Invoke args
220
+ let instance = constructor args
201
221
do ! objDef.Validator instance
202
222
|> ValidationResult.mapErrors ( fun err -> err |> mapInputObjectError inputSource inputObjectPath originalInputDef)
203
223
return instance
0 commit comments