@@ -89,10 +89,30 @@ let rec internal compileByType (inputObjectPath: FieldPath) (inputSource : Input
8989
9090 | InputObject objDef ->
9191 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+
93113
94114 let struct ( mapper , nullableMismatchParameters , missingParameters ) =
95- ctor.GetParameters ()
115+ parameterInfos
96116 |> Array.fold (
97117 fun
98118 struct( all : ResizeArray < _ >, areNullable : HashSet < _ >, missing : HashSet < _ >)
@@ -170,7 +190,7 @@ let rec internal compileByType (inputObjectPath: FieldPath) (inputSource : Input
170190
171191 let! args = argResults |> splitSeqErrorsList
172192
173- let instance = ctor.Invoke args
193+ let instance = constructor args
174194 do ! objDef.Validator instance
175195 |> ValidationResult.mapErrors ( fun err -> err |> mapInputObjectError inputSource inputObjectPath originalInputDef)
176196 return instance
@@ -197,7 +217,7 @@ let rec internal compileByType (inputObjectPath: FieldPath) (inputSource : Input
197217
198218 let! args = argResults |> splitSeqErrorsList
199219
200- let instance = ctor.Invoke args
220+ let instance = constructor args
201221 do ! objDef.Validator instance
202222 |> ValidationResult.mapErrors ( fun err -> err |> mapInputObjectError inputSource inputObjectPath originalInputDef)
203223 return instance
0 commit comments