public string Generate(ConversionParam param)
        {
            string indent = "    ";
            string indent2 = "        ";
            string indent3 = "            ";

            SourceStructure structure = param.Structure;
            StringBuilder builder = new StringBuilder();
            Type convertedType = ClassCodeToTypeConverter.Generate(param);
            param.SourceClassName = convertedType.Name;

            builder.AppendLine(structure.ImportClause);
            builder.AppendLine();
            builder.AppendLine("namespace " + param.ConvertedNamespace);
            builder.AppendLine("{");
            builder.AppendLine(indent +
                string.Format(
                    structure.ClassDeclarationFormat,
                    structure.SourceObjectName,
                    structure.DestinationObjectName,
                    param.SourceClassName,
                    param.ConvertedClassName
                )
            );
            builder.AppendLine("    {");
            builder.AppendLine(indent2 +
                string.Format(
                    structure.MethodDeclarationFormat,
                    structure.SourceObjectName,
                    structure.DestinationObjectName,
                    param.SourceClassName,
                    param.ConvertedClassName
                )
            );
            builder.AppendLine(indent2 + "{");

            builder.AppendLine(indent3 +
                string.Format(
                    "{0} {1} = new {0}();",
                    param.ConvertedClassName,
                    structure.DestinationObjectName
                )
            );

            builder.AppendLine(TypeToMapperGenerator.Generate(param, convertedType));

            builder.AppendLine(indent3 +
                string.Format(
                    "return {0};",
                    structure.DestinationObjectName
                )
            );
            builder.AppendLine(indent2 + "}");
            builder.AppendLine("    }");
            builder.AppendLine("}");

            return builder.ToString();
        }
        public string Generate(ConversionParam param, Type type)
        {
            if (type == null)
            {
                return "";
            }

            SourceStructure structure = param.Structure;
            StringBuilder builder = new StringBuilder();
            IEnumerable<PropertyInfo> properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
            foreach (PropertyInfo prop in properties)
            {
                bool isFound = false;
                foreach (MapTypeRule typeRule in structure.MapTypeRule)
                {
                    string primitiveType = PrimitiveTypes.Get(typeRule.DataType, typeRule.DataType);
                    if (primitiveType.Equals(prop.PropertyType.Name, StringComparison.OrdinalIgnoreCase))
                    {
                        builder.Append(indent3);
                        builder.AppendFormat(
                            typeRule.Assignment + " = " + typeRule.Conversion,
                            structure.SourceObjectName,
                            structure.DestinationObjectName,
                            param.SourceClassName,
                            param.ConvertedClassName,
                            prop.Name,
                            PascalToUnderscore.Convert(prop.Name)
                            );
                        builder.AppendLine(";");
                        isFound = true;
                        break;
                    }
                }
                if (!isFound)
                {
                    builder.Append(indent3);
                    builder.AppendFormat(
                            structure.DefaultAssignmentRuleConversion + " = " + structure.DefaultRuleConversion,
                            structure.SourceObjectName,
                            structure.DestinationObjectName,
                            param.SourceClassName,
                            param.ConvertedClassName,
                            prop.Name,
                            PascalToUnderscore.Convert(prop.Name)
                            );
                    builder.AppendLine(";");
                }
            }
            return builder.ToString();
        }
        public Type Generate(ConversionParam param)
        {
            Dictionary<string, string> compilerProviderOptions = new Dictionary<string, string>
            {
                {"CompilerVersion", "v4.0"}
            };
            CSharpCodeProvider provider = new CSharpCodeProvider(compilerProviderOptions);
            CompilerParameters compilerParams = new CompilerParameters
            {
                GenerateInMemory = true,
                GenerateExecutable = false
            };
            compilerParams.ReferencedAssemblies.Add("System.Core.dll");
            compilerParams.ReferencedAssemblies.Add("Microsoft.CSharp.dll");

            StringBuilder source = new StringBuilder();
            source.AppendLine(param.SourceClassCode);
            //source.AppendLine("public class TypeReturner{");
            //source.AppendLine("    public Type Get(){");
            //source.AppendLine("        return typeof(" + param.SourceNamespace + "." + param.SourceClassName + ");");
            //source.AppendLine("    }");
            //source.AppendLine("}");

            CompilerResults results = provider.CompileAssemblyFromSource(compilerParams, source.ToString());
            if (results.Errors.Count > 0)
            {
                return null;
            }
            else
            {
                Assembly assembly = results.CompiledAssembly;
                if (assembly.GetTypes().Count() == 0)
                {
                    return null;
                }
                Type classType = assembly.GetTypes().First();
                param.SourceClassName = classType.Name;
                return classType;

                //object compiledObject = assembly.CreateInstance("TypeReturner");
                //MethodInfo compiledMethod = compiledObject.GetType().GetMethod("Get");

                //return (Type)compiledMethod.Invoke(compiledObject, null);
            }
        }
        private void btnGenerate_Click(object sender, EventArgs e)
        {
            ConversionParam param = new ConversionParam();

            param.SourceClassCode = textClass.Text;
            param.Structure = bsStructureList.Current as SourceStructure;
            //textResult.Text = MapperClassGenerator.Generate(param);
        }