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