private Func <RequestContext, IDataReaderWrapper, IDataReaderDeserializer, object> CreateNestedObjectConvertImpl(RequestContext requestContext, Type targetType) { var dynamicMethod = new DynamicMethod("NestedObjectConvert_" + Guid.NewGuid().ToString("N"), targetType, new[] { TypeUtils.RequestContextType, _dataReaderWrapperType, _deserType }, targetType, true); var iLGenerator = dynamicMethod.GetILGenerator(); iLGenerator.DeclareLocal(targetType); MultipleResultMap multipleResultMap = requestContext.Statement.MultipleResultMap; if (multipleResultMap.Root != null) { iLGenerator.Emit(OpCodes.Ldarg_2); iLGenerator.Emit(OpCodes.Ldarg_0); iLGenerator.Emit(OpCodes.Ldarg_1); iLGenerator.Emit(OpCodes.Ldc_I4_0); var deserToRoot = _deserToSingle.MakeGenericMethod(targetType); iLGenerator.Emit(OpCodes.Call, deserToRoot); iLGenerator.Emit(OpCodes.Stloc_0); EmitNextResult(iLGenerator); } else { ConstructorInfo targetCtor = targetType.GetConstructor( BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null); iLGenerator.Emit(OpCodes.Newobj, targetCtor); // [target] iLGenerator.Emit(OpCodes.Stloc_0); } foreach (var result in multipleResultMap.Results) { var property = targetType.GetProperty(result.Property); var propertyType = property.PropertyType; bool isEnum = _enumerableType.IsAssignableFrom(propertyType); MethodInfo executeMethod = null; if (isEnum) { var enumChildType = propertyType.GenericTypeArguments[0]; executeMethod = _deserToEnumerable.MakeGenericMethod(enumChildType); } else { executeMethod = _deserToSingle.MakeGenericMethod(propertyType); } iLGenerator.Emit(OpCodes.Ldloc_0); iLGenerator.Emit(OpCodes.Ldarg_2); iLGenerator.Emit(OpCodes.Ldarg_0); iLGenerator.Emit(OpCodes.Ldarg_1); iLGenerator.Emit(OpCodes.Ldc_I4_0); iLGenerator.Emit(OpCodes.Call, executeMethod); iLGenerator.Emit(OpCodes.Call, property.SetMethod); EmitNextResult(iLGenerator); } iLGenerator.Emit(OpCodes.Ldloc_0); iLGenerator.Emit(OpCodes.Ret); var funcType = System.Linq.Expressions.Expression.GetFuncType(TypeUtils.RequestContextType, _dataReaderWrapperType, _deserType, targetType); return((Func <RequestContext, IDataReaderWrapper, IDataReaderDeserializer, object>)dynamicMethod.CreateDelegate(funcType)); }
private void BuildMultipleResultMap(XmlNode mulResultNode) { mulResultNode.Attributes.TryGetValueAsString(nameof(MultipleResultMap.Id), out var id, SmartSqlConfig.Properties); var multipleResultMap = new MultipleResultMap { Id = id, Results = new List <Result> { } }; if (multipleResultMap.Id.IndexOf('.') < 0) { multipleResultMap.Id = $"{SqlMap.Scope}.{multipleResultMap.Id}"; } foreach (XmlNode childNode in mulResultNode.ChildNodes) { childNode.Attributes.TryGetValueAsString("Property", out var property, SmartSqlConfig.Properties); childNode.Attributes.TryGetValueAsString("MapId", out var mapId, SmartSqlConfig.Properties); var result = new Result { Property = property, MapId = mapId, }; if (result.MapId?.IndexOf('.') < 0) { result.MapId = $"{SqlMap.Scope}.{result.MapId}"; } if (childNode.Name == "Root") { result.Property = Result.ROOT_PROPERTY; multipleResultMap.Root = result; multipleResultMap.Results.Add(result); } else { multipleResultMap.Results.Add(result); } } SqlMap.MultipleResultMaps.Add(multipleResultMap.Id, multipleResultMap); }
public ResultMap GetCurrentResultMap() { return(MultipleResultMap != null ? MultipleResultMap.GetResultMap(ExecutionContext.DataReaderWrapper.ResultIndex) : ResultMap); }