Esempio n. 1
0
        /// <summary>
        /// Creates the action delegate used to hydrate a record's members with data from the reader.
        /// </summary>
        /// <typeparam name="T">The record type.</typeparam>
        protected virtual Action <T> CreateHydrateRecordAction <T>()
        {
            var recordType = typeof(T);

            if (reader.Context.ReaderConfiguration.Maps[recordType] == null)
            {
                reader.Context.ReaderConfiguration.Maps.Add(reader.Context.ReaderConfiguration.AutoMap(recordType));
            }

            var mapping = reader.Context.ReaderConfiguration.Maps[recordType];

            var recordTypeParameter = Expression.Parameter(recordType, "record");
            var memberAssignments   = new List <Expression>();

            foreach (var memberMap in mapping.MemberMaps)
            {
                var fieldExpression = expressionManager.CreateGetFieldExpression(memberMap);
                if (fieldExpression == null)
                {
                    continue;
                }

                var memberTypeParameter = Expression.Parameter(memberMap.Data.Member.MemberType(), "member");
                var memberAccess        = Expression.MakeMemberAccess(recordTypeParameter, memberMap.Data.Member);
                var memberAssignment    = Expression.Assign(memberAccess, fieldExpression);
                memberAssignments.Add(memberAssignment);
            }

            foreach (var referenceMap in mapping.ReferenceMaps)
            {
                if (!reader.CanRead(referenceMap))
                {
                    continue;
                }

                var referenceBindings = new List <MemberBinding>();
                expressionManager.CreateMemberBindingsForMapping(referenceMap.Data.Mapping, referenceMap.Data.Member.MemberType(), referenceBindings);

                // This is in case an IContractResolver is being used.
                var type          = ReflectionHelper.CreateInstance(referenceMap.Data.Member.MemberType()).GetType();
                var referenceBody = Expression.MemberInit(Expression.New(type), referenceBindings);

                var memberTypeParameter = Expression.Parameter(referenceMap.Data.Member.MemberType(), "referenceMember");
                var memberAccess        = Expression.MakeMemberAccess(recordTypeParameter, referenceMap.Data.Member);
                var memberAssignment    = Expression.Assign(memberAccess, referenceBody);
                memberAssignments.Add(memberAssignment);
            }

            var body = Expression.Block(memberAssignments);

            return(Expression.Lambda <Action <T> >(body, recordTypeParameter).Compile());
        }
Esempio n. 2
0
        /// <summary>
        /// Creates the action delegate used to hydrate a record's members with data from the reader.
        /// </summary>
        /// <typeparam name="T">The record type.</typeparam>
        protected virtual Action <T> CreateHydrateRecordAction <T>()
        {
            var recordType = typeof(T);

            if (reader.Context.Maps[recordType] == null)
            {
                reader.Context.Maps.Add(reader.Context.AutoMap(recordType));
            }

            var mapping = reader.Context.Maps[recordType];

            var recordTypeParameter = Expression.Parameter(recordType, "record");
            var memberAssignments   = new List <Expression>();

            foreach (var memberMap in mapping.MemberMaps)
            {
                var fieldExpression = expressionManager.CreateGetFieldExpression(memberMap);
                if (fieldExpression == null)
                {
                    continue;
                }

                var memberTypeParameter = Expression.Parameter(memberMap.Data.Member.MemberType(), "member");
                var memberAccess        = Expression.MakeMemberAccess(recordTypeParameter, memberMap.Data.Member);
                var memberAssignment    = Expression.Assign(memberAccess, fieldExpression);
                memberAssignments.Add(memberAssignment);
            }

            foreach (var referenceMap in mapping.ReferenceMaps)
            {
                if (!reader.CanRead(referenceMap))
                {
                    continue;
                }

                var referenceAssignments = new List <MemberAssignment>();
                expressionManager.CreateMemberAssignmentsForMapping(referenceMap.Data.Mapping, referenceAssignments);

                var referenceBody = expressionManager.CreateInstanceAndAssignMembers(referenceMap.Data.Member.MemberType(), referenceAssignments);

                var memberTypeParameter = Expression.Parameter(referenceMap.Data.Member.MemberType(), "referenceMember");
                var memberAccess        = Expression.MakeMemberAccess(recordTypeParameter, referenceMap.Data.Member);
                var memberAssignment    = Expression.Assign(memberAccess, referenceBody);
                memberAssignments.Add(memberAssignment);
            }

            var body = Expression.Block(memberAssignments);

            return(Expression.Lambda <Action <T> >(body, recordTypeParameter).Compile());
        }