Exemplo n.º 1
0
        /// <summary>
        /// Generates setter method using xml config or type metadata (attributes).
        /// </summary>
        /// <param name="targetClassType"></param>
        /// <param name="schemeId"></param>
        /// <param name="dtSource"></param>
        /// <returns></returns>
        protected ExtractInfo GenerateSetterMethod(
            ExtractInfo extractInfo,
            DataTable dtSource,
            Type generatorSourceType,
            int extractLevel,
            bool createNamespace)
        {
            //Method alredy exists
            if (extractInfo.FillMethodInfo.ContainsKey(generatorSourceType))
            {
                return(extractInfo);
            }

            WriteDebugCreate(extractInfo, extractLevel, generatorSourceType);

            IPropertySetterGenerator methodGenerator = _SetterGenerators[generatorSourceType];

            //Generating Type and method declaration
            TypeBuilder   typeBuilder   = CreateAssemblyType(extractInfo.TargetType, extractInfo.SchemeId, generatorSourceType, createNamespace);
            MethodBuilder methodBuilder = GenerateSetterMethodDefinition(
                extractInfo.TargetType, typeBuilder, methodGenerator.DataSourceType);

            extractInfo.FillMethodInfo[methodGenerator.DataSourceType] = methodBuilder;
            extractInfo.MethodIndex[methodGenerator.DataSourceType]    = _MethodIndex++;

            ILGenerator ilGen = methodBuilder.GetILGenerator();

            //First process complex types
            foreach (RelationExtractInfo item in extractInfo.SubTypes)
            {
                GenerateSetterMethod(
                    item.RelatedExtractInfo,
                    dtSource,
                    generatorSourceType,
                    extractLevel + 1,
                    true
                    );
            }

            //Generate method body
            GenerateSetterMethod(ilGen, methodGenerator, extractInfo, dtSource, extractLevel);

            Type type           = typeBuilder.CreateType();
            var  fillMethodInfo = type.GetMethod("SetProps_" + extractInfo.TargetType);

            extractInfo.FillMethodInfo[methodGenerator.DataSourceType] = fillMethodInfo;
            extractInfo.FillMethod[methodGenerator.DataSourceType]     =
                (FillMethodDef)Delegate.CreateDelegate(typeof(FillMethodDef), null, fillMethodInfo);

            WriteDebugDone(extractInfo, extractLevel);

            return(extractInfo);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Generates setter method using xml config or type metadata (attributes).
        /// </summary>
        /// <param name="targetClassType"></param>
        /// <param name="schemeId"></param>
        /// <param name="dtSource"></param>
        /// <returns></returns>
        protected void GenerateSetterMethod(
            ILGenerator ilGen,
            IPropertySetterGenerator methodGenerator,
            ExtractInfo extractInfo,
            DataTable dtSource,
            int extractLevel)
        {
            methodGenerator.GenerateMethodHeader(
                ilGen,
                extractInfo.MethodIndex[methodGenerator.DataSourceType]);

            int propIx = 0;

            foreach (MemberExtractInfo mei in extractInfo.MemberColumns)
            {
                int columnIx = dtSource.Columns.IndexOf(mei.MapName);
                if (columnIx < 0)
                {
                    //Debug.WriteLine(string.Format(
                    //    "Warning! Column {0} that was defined in mapping does not exists. No mapping code will be generated for member {1}",
                    //    mei.MapName,
                    //    mei.Member.Name));
                    //propIx++;
                    //continue;
                    throw new DataMapperException(
                              string.Format(
                                  "Column {0} that was defined in mapping does not exists. Try to use another mapping schema.",
                                  mei.MapName));
                }

                WriteDebugGenerateSetter(extractLevel, mei, propIx, dtSource, columnIx);
                methodGenerator.CreateExtractScalar(
                    ilGen,
                    mei.Member as PropertyInfo,
                    mei.Member as FieldInfo,
                    dtSource.Columns[columnIx].DataType,
                    propIx++
                    );
            }

            foreach (RelationExtractInfo rei in extractInfo.ChildTypes)
            {
                WriteDebugGenerateFillChildren(extractLevel, rei);
                methodGenerator.CreateExtractNested(
                    ilGen,
                    rei.Member as PropertyInfo,
                    rei.RelatedExtractInfo.TargetType,
                    rei.MapName,
                    rei.RelatedExtractInfo.SchemeId
                    );
            }

            foreach (RelationExtractInfo rei in extractInfo.SubTypes)
            {
                WriteDebugGenerateFillChildren(extractLevel, rei);
                methodGenerator.GenerateExtractComplex(
                    ilGen,
                    rei.Member as PropertyInfo,
                    rei.RelatedExtractInfo.TargetType,
                    rei.RelatedExtractInfo.FillMethodInfo[methodGenerator.DataSourceType],
                    rei.RelatedExtractInfo.MethodIndex[methodGenerator.DataSourceType]
                    );
            }

            ilGen.Emit(OpCodes.Ldloc_2);
            ilGen.Emit(OpCodes.Ret);
        }