/// <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()); }
/// <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()); }