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