Example #1
0
        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();
        }