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