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));
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
 public ResultMap GetCurrentResultMap()
 {
     return(MultipleResultMap != null
         ? MultipleResultMap.GetResultMap(ExecutionContext.DataReaderWrapper.ResultIndex)
         : ResultMap);
 }