Beispiel #1
0
 public TypeData GenerateCode(Type sourceType, Type destinationType, int counter)
 {
     var methodName =
         sourceType.GetMethods(BindingFlags.Public | BindingFlags.Static)
             .Where(
                 m =>
                     (m.Name == "op_Implicit" || m.Name == "op_Explicit") && m.ReturnType == destinationType &&
                     m.GetParameters().Count() == 1 && m.GetParameters()[0].ParameterType == sourceType)
             .Concat(destinationType.GetMethods(BindingFlags.Public | BindingFlags.Static)
                 .Where(
                     m =>
                         (m.Name == "op_Implicit" || m.Name == "op_Explicit") && m.ReturnType == destinationType &&
                         m.GetParameters().Count() == 1 && m.GetParameters()[0].ParameterType == sourceType))
             .OrderByDescending(m => m.Name).First().Name;
     var result = new TypeData();
     if (methodName == "op_Implicit")
     {
         result.Source = NameConstants.DestName + " = " + NameConstants.SourceName;
     }
     else
     {
         result.Source =
             NameConstants.DestName + " = (" + NameConstants.DestinationMemType + ")" + NameConstants.SourceName;
     }
     return null;
 }
Beispiel #2
0
        public TypeData GenerateCode(Type sourceMember, Type destinationMember, int counter)
        {
            var r = sourceMember.GetCollectionType() != CollectionType.None && destinationMember.GetCollectionType() != CollectionType.None;

            TypeData result;

            if (sourceMember.GetCollectionType() == CollectionType.None &&
                destinationMember.GetCollectionType() == CollectionType.None)
            {
                result = new TypeData
                {
                    Source = CodeSnippets.SingleMappingCodeSnippet
                };
            }
            else
            {
                result = new TypeData
                {
                    Source = CodeSnippets.MultipleMappingCodeSnippet
                };
            }
            return result;
        }
        public TypeData GenerateCode(Type sourceType, Type destinationType, int counter)
        {
            var result = new TypeData();

            if (TypeHelper.IsPrimitiveType(sourceType) && TypeHelper.IsPrimitiveType(destinationType))
            {
                result.Source = GetPrimiteTypeCode(sourceType, destinationType);

            }
            if (sourceType.IsEnum && destinationType.IsEnum)
            {
                result.Source = "(" + NameConstants.DestName + ")(" + "obj." + NameConstants.SourceName + ")";
            }
            if ((sourceType.IsEnum && TypeHelper.IsNumeralType(destinationType)) ||
                (destinationType.IsEnum && TypeHelper.IsNumeralType(sourceType)))
            {
                result.Source = "(" + NameConstants.DestName + ")" +
                                    (sourceType.IsEnum
                                        ? "(" + Enum.GetUnderlyingType(sourceType).FullName + ")(" + "obj." + NameConstants.SourceName + ")"
                                        : "(" + "obj." + NameConstants.SourceName + ")");
            }
            if (destinationType.IsNullable() && destinationType.GetGenericArguments()[0] == sourceType)
            {
                result.Source = NameConstants.DestName + " = " + NameConstants.SourceName;
            }
            if (destinationType.IsNullable() && sourceType.IsNullable() && (sourceType.GetGenericArguments()[0] == destinationType.GetGenericArguments()[0]))
            {
                result.Source = NameConstants.DestName + " = " + NameConstants.SourceName;
            }
            return result;
        }
        public TypeData GenerateCodeInternal(Type sourceType, Type destinationType, int counter,
            string setterVarName = null, int level = 1)
        {
            var builder = new StringBuilder();
            var result = new TypeData();
            //Array & Array = array + for + index
            //Array & IEnumerable = array + GetEnumerator + index
            //Array & List = array + for + index
            //List & IEnumerable = List + GetEnumerator + Add
            //List & Array = list + for + Add
            //List & List = list + for + Add
            //IEnumerable & IEnumerable = array + GetEnumerator + index
            //IEnumerable & Array = array + for + index
            //IEnumerable & List = array + for + index
            builder.Append(NameConstants.DestName).Append(" = ")
                .Append(NameConstants.SourceName + " == null ")
                .Append("? null : ")
                .Append("new ")
                .Append(TypeHelper.GetTypeDeclaration(destinationType));
            if (destinationType.GetCollectionType() == CollectionType.Array || destinationType.GetCollectionType() == CollectionType.Enumerable)
            {
                var ind = builder.IndexOf("[]");
                builder.Replace("[]", "[" + NameConstants.SourceName + ".Count()" + "]", ind, 2);
            }
            else
            {
                builder.Append("(" + NameConstants.SourceName + ".Count()" + ")");
            }

            builder.Append(";");

            builder.Append("if(" + NameConstants.DestName + " != null){");

            var index = new string('i', level);
            var local = new string('l', level);
            TypeData res = null;
            switch (sourceType.GetCollectionType())
            {
                case CollectionType.Enumerable:
                    var index2 = new string('n', level);
                    builder.Append("using( var ")
                        .Append(index)
                        .Append(" = ")
                        .Append(NameConstants.SourceName)
                        .Append(".GetEnumerator()")
                        .Append("){");
                    builder.Append("var ").Append(index2).Append(" = 0;");
                    builder.Append("while(").Append(index).Append(".MoveNext()){");
                    builder.Append("var ");

                    if (sourceType.GetCollectionElementType().GetCollectionType() == CollectionType.None)
                    {
                        res = TypeResolver.Resolve(sourceType.GetCollectionElementType(),
                            destinationType.GetCollectionElementType(), counter);
                        res.Header =
                            res.Header.Inject(
                                new Dictionary<string, string>
                                {
                                    {
                                        NameConstants.DestinationMemType,
                                        destinationType.GetCollectionElementType().FullName
                                    },
                                    {
                                        NameConstants.SourceMemType,
                                        sourceType.GetCollectionElementType().FullName
                                    }
                                });
                        res.Source =
                            res.Source.Inject(
                                new Dictionary<string, string>
                                {
                                    {
                                        NameConstants.DestinationMemType,
                                        destinationType.GetCollectionElementType().FullName
                                    },
                                    {
                                        NameConstants.SourceMemType,
                                        sourceType.GetCollectionElementType().FullName
                                    },
                                });

                        builder.Append(
                            res.Source.Inject(new Dictionary<string, string>
                            {
                                {NameConstants.DestName, local},
                                {NameConstants.SourceName, index + ".Current"},
                                {NameConstants.InnerDestName, "null"}
                            }));
                        builder.Append(";");
                    }
                    else
                    {
                        var source = index + ".Current";
                        res = GenerateCodeInternal(sourceType.GetCollectionElementType(),
                            destinationType.GetCollectionElementType(), counter,
                            local, level + 1);
                        res.Source = res
                            .Source.Inject(new Dictionary<string, string>
                            {
                                {NameConstants.DestName, local},
                                {NameConstants.SourceName, source}
                            });
                        builder.Append(res.Source);
                    }
                    result.Header += res.Header;

                    if (destinationType.GetCollectionType() == CollectionType.List ||
                        destinationType.GetCollectionType() == CollectionType.ArrayList)
                    {
                        builder.Append(setterVarName).Append(".Add(").Append(local).Append(");");
                    }
                    else
                    {

                        builder.Append(NameConstants.DestName)
                            .Append("[")
                            .Append(index2)
                            .Append("] = ")
                            .Append(local)
                            .Append(";");
                    }
                    builder.Append(index2).Append("++;");
                    builder.Append("}");
                    builder.Append("}");
                    break;
                default:
                    builder.Append("for(var ")
                        .Append(index)
                        .Append(" = 0;")
                        .Append(index)
                        .Append("<")
                        .Append(NameConstants.SourceName)
                        .Append(".Count();")
                        .Append(index)
                        .Append("++){");
                    builder.Append("var ");
                    if (sourceType.GetCollectionElementType().GetCollectionType() == CollectionType.None)
                    {
                        res = TypeResolver.Resolve(sourceType.GetCollectionElementType(),
                            destinationType.GetCollectionElementType(), counter);
                        res.Header =
                            res.Header.Inject(
                                new Dictionary<string, string>
                                {
                                    {
                                        NameConstants.DestinationMemType,
                                        destinationType.GetCollectionElementType().FullName
                                    },
                                    {
                                        NameConstants.SourceMemType,
                                        sourceType.GetCollectionElementType().FullName
                                    }
                                });
                        res.Source =
                            res.Source.Inject(
                                new Dictionary<string, string>
                                {
                                    {
                                        NameConstants.DestinationMemType,
                                        destinationType.GetCollectionElementType().FullName
                                    },
                                    {
                                        NameConstants.SourceMemType,
                                        sourceType.GetCollectionElementType().FullName
                                    },
                                });

                        builder.Append(
                            res.Source.Inject(new Dictionary<string, string>
                            {
                                {NameConstants.DestName, local},
                                {NameConstants.SourceName, NameConstants.SourceName + "[" + index + "]"},
                                {NameConstants.InnerDestName, "null"}
                            })
                            );
                        builder.Append(";");
                    }
                    else
                    {
                        var sourceName = NameConstants.SourceName + "[" + index + "]";
                        res = GenerateCodeInternal(sourceType.GetCollectionElementType(),
                            destinationType.GetCollectionElementType(), counter,
                            local,
                            level + 1);

                        res.Source =
                            res.Source.Inject(new Dictionary<string, string> {{NameConstants.SourceName, sourceName}, {NameConstants.DestName, local}});
                        builder.Append(res.Source);
                    }
                    result.Header += res.Header;

                    if (destinationType.GetCollectionType() == CollectionType.List ||
                        destinationType.GetCollectionType() == CollectionType.ArrayList)
                    {
                        builder.Append(setterVarName).Append(".Add(").Append(local).Append(");");
                    }
                    else
                    {
                        builder.Append(NameConstants.DestName).Append("[").Append(index).Append("] = ").Append(local).Append(";");
                    }
                    builder.Append("}");
                    break;
            }

            builder.Append("}");

            result.Source = builder.ToString();
            return result;
        }