private AggregateFunctionContext CreateMemberContext(ClassMappingDescriptor descriptor, MemberMappingDescriptor member, FunctionMap functionMap)
        {
            Type   implementationType = functionMap.GetTypeForFunction(member.AggregateMappingDescription.FunctionName);
            string functionObjectName = string.Format("_{0}_to_{1}_Fn_",
                                                      member.AggregateMappingDescription.FunctionObject,
                                                      member.Member);

            if (implementationType.IsGenericType)
            {
                if (member.IsArray || member.IsList)
                {
                    Type instanceType = member.IsArray ?
                                        member.AggregateMappingDescription.TargetType.GetElementType() :
                                        member.AggregateMappingDescription.TargetType.GetGenericArguments()[0];
                    implementationType = implementationType.MakeGenericType(instanceType);
                }
                else
                {
                    implementationType = implementationType.MakeGenericType(member.AggregateMappingDescription.TargetType);
                }
            }

            IAggregateFunctionCodeGenerator generator = GetGeneratorImpl(implementationType, member);

            return(new AggregateFunctionContext(member,
                                                descriptor,
                                                implementationType,
                                                functionObjectName,
                                                generator));
        }
        public AggregateFunctionContext(MemberMappingDescriptor member, 
            ClassMappingDescriptor descriptor,
            Type implementationType,
            string functionObjectName,
            IAggregateFunctionCodeGenerator generator)
        {
            m_member = member;
            m_generator = generator;
            m_functionObjectName = functionObjectName;
            m_implementationType = implementationType;
            m_descriptor = descriptor;

            m_pathItems = ExpressionParser.BuildAggregatePathItem(descriptor, member);
            m_sourceItem = m_pathItems[m_pathItems.Count - 1];
        }
        public AggregateFunctionContext(MemberMappingDescriptor member,
                                        ClassMappingDescriptor descriptor,
                                        Type implementationType,
                                        string functionObjectName,
                                        IAggregateFunctionCodeGenerator generator)
        {
            m_member             = member;
            m_generator          = generator;
            m_functionObjectName = functionObjectName;
            m_implementationType = implementationType;
            m_descriptor         = descriptor;

            m_pathItems  = ExpressionParser.BuildAggregatePathItem(descriptor, member);
            m_sourceItem = m_pathItems[m_pathItems.Count - 1];
        }