public string Generate() { var headerBuilder = new StringBuilder(); var codeBuilder = new StringBuilder(); const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance; MemberInfo[] destinationMembers = _destination.GetFields(bindingFlags).Cast<MemberInfo>() .Concat(_destination.GetProperties(bindingFlags)).Where(m => !m.GetCustomAttributes(typeof(NotMapAttribute), false).Any()).ToArray(); var resolver = new MemberResolver(_source, _key); var counter = 0; foreach (var destinationMember in destinationMembers) { var destinationType = TypeHelper.GetMemberType(destinationMember); var code = resolver.Resolve(destinationMember, counter); if(code == null) continue; if (!string.IsNullOrEmpty(code.CodeString)) { codeBuilder.Append("{"); codeBuilder.Append(code.CodeString); codeBuilder.Append("}"); } if (!string.IsNullOrEmpty(code.HeaderString)) { headerBuilder.Append(code.HeaderString); } codeBuilder.Inject( new Dictionary<string, string> { {NameConstants.DestinationMemName, "result."+destinationMember.Name}, {NameConstants.DestinationMemType, TypeHelper.GetTypeString(destinationType)}, {NameConstants.DestinationInternalType,TypeHelper.GetTypeString(destinationType.GetCollectionElementType())}, {NameConstants.DestinationMemTypeEscaped,TypeHelper.GetTypeString(destinationType).Replace(".", "_")}, {NameConstants.InternalDestinationMemTypeEscaped,TypeHelper.GetTypeString(destinationType.GetCollectionElementType()).Replace(".", "_")} }); headerBuilder.Inject( new Dictionary<string, string> { {NameConstants.DestinationMemName, destinationMember.Name}, {NameConstants.DestinationMemType, TypeHelper.GetTypeString(destinationType)}, {NameConstants.DestinationInternalType,TypeHelper.GetTypeString(destinationType.GetCollectionElementType())}, {NameConstants.DestinationMemTypeEscaped,TypeHelper.GetTypeString(destinationType).Replace(".", "_")}, {NameConstants.InternalDestinationMemTypeEscaped,TypeHelper.GetTypeString(destinationType.GetCollectionElementType()).Replace(".", "_")} }); counter++; } codeBuilder.Inject(new Dictionary<string, string> { {NameConstants.DestinationType, _destination.FullName}, {NameConstants.SourceType, _source.FullName} }); headerBuilder.Inject(new Dictionary<string, string> { {NameConstants.DestinationType, _destination.FullName}, {NameConstants.SourceType, _source.FullName} }); var classBuilder = new StringBuilder(); classBuilder.Append("using System;"); classBuilder.Append("using System.Linq;"); classBuilder.Append("using GenMapper;"); classBuilder.Append("using System.Collections.Generic;"); classBuilder.Append("using " + _source.Namespace+";"); classBuilder.Append("using " + _destination.Namespace + ";"); classBuilder.Append("namespace MappedClasses{"); classBuilder.Append("public static partial class GeneratedMapper{"); classBuilder.Append(headerBuilder); classBuilder.Append("public static " + _destination.FullName + " Map_" + NameConstants.SourceTypeEscaped + "_To_" + NameConstants.DestinationTypeEscaped + "(" + _source.FullName + " obj, " + _destination.FullName + " result){"); classBuilder.Append("if(obj == null) return null;"); classBuilder.Append("result = result ?? new " + _destination.FullName + "();"); classBuilder.Append(codeBuilder); classBuilder.Append("return result;"); classBuilder.Append("}"); classBuilder.Append("public static IEnumerable<" + _destination.FullName + "> MapCollection_" + NameConstants.SourceTypeEscaped + "_To_" + NameConstants.DestinationTypeEscaped + "(IEnumerable<" + _source.FullName + "> obj){"); classBuilder.Append("if(obj == null) return null;"); classBuilder.Append("var result = new " + _destination.FullName + "[obj.Count()];"); classBuilder.Append("var index = 0;"); classBuilder.Append("using( var enumer = obj.GetEnumerator()){"); classBuilder.Append("while(enumer.MoveNext()){"); classBuilder.Append("result[index] = Map_" + NameConstants.SourceTypeEscaped + "_To_" + NameConstants.DestinationTypeEscaped + "(enumer.Current, null);"); classBuilder.Append("index++;"); classBuilder.Append("}"); classBuilder.Append("}"); classBuilder.Append("return (IEnumerable<" + _destination.FullName + ">)result;"); classBuilder.Append("}"); classBuilder.Append("}"); classBuilder.Append("}"); classBuilder.Inject(new Dictionary<string, string> { {NameConstants.SourceTypeEscaped, _source.FullName.Replace(".", "_")}, {NameConstants.DestinationTypeEscaped, _destination.FullName.Replace(".", "_")} }); return classBuilder.ToString(); }