public virtual ObjectConstructionResult CreateObject(ImportContext context) { if (context == null) { throw new ArgumentNullException("context"); } JsonBufferWriter tailw = _tailw; _tailw = null; if (tailw != null) { tailw.WriteEndObject(); } JsonBuffer tail = (tailw != null ? tailw.GetBuffer() : StockJsonBuffers.EmptyObject); object obj = OnCreateObject(context); return(new ObjectConstructionResult(obj, tail.CreateReader())); }
private static ObjectConstructionResult TryCreateObject(ImportContext context, ConstructorInfo ctor, NamedJsonBuffer[] members) { Debug.Assert(context != null); Debug.Assert(ctor != null); Debug.Assert(members != null); ParameterInfo[] parameters = ctor.GetParameters(); if (parameters.Length > members.Length) { return(null); } int[] bindings = Bind(context, parameters, members); int argc = 0; object[] args = null; JsonBufferWriter tailw = null; for (int i = 0; i < bindings.Length; i++) { int binding = bindings[i] - 1; if (binding >= 0) { if (args == null) { args = new object[parameters.Length]; } Type type = parameters[binding].ParameterType; JsonBuffer arg = members[i].Buffer; args[binding] = context.Import(type, arg.CreateReader()); argc++; } else { if (tailw == null) { tailw = new JsonBufferWriter(); tailw.WriteStartObject(); } NamedJsonBuffer member = members[i]; tailw.WriteMember(member.Name); tailw.WriteFromReader(member.Buffer.CreateReader()); } } if (tailw != null) { tailw.WriteEndObject(); } if (argc != parameters.Length) { return(null); } object obj = ctor.Invoke(args); JsonBuffer tail = tailw != null ? tailw.GetBuffer() : StockJsonBuffers.EmptyObject; return(new ObjectConstructionResult(obj, tail.CreateReader())); }