public void CompileAndCompose() { while (compileQueue.Count != 0) { LocalCompilationContext context = compileQueue.Dequeue(); context.Compile(); composeQueue.Enqueue(context); } if (WithComments) { Console.WriteLine(); Console.WriteLine("Dependencies list:"); foreach (Type dependenceType in Dependencies.Keys) { Console.WriteLine(dependenceType); } } while (composeQueue.Count != 0) { LocalCompilationContext context = composeQueue.Dequeue(); context.Compose(); } }
public SerializationMethodsBase AddTypeDependence(Type type) { SerializationMethodsBase result; if (Dependencies.TryGetValue(type, out result)) { return(result); } else { if (Serializer.GetCached(type, out result)) { } else { // Collections like types if (type.IsArray) { result = new ArraySerializationMethodsChain(type, AddTypeDependence(type.GetElementType()), false); } else if (type.GetInterfaces().Any((Type t) => SerializeStream.IsCollectionType(t))) { Type elementType = type.GetInterfaces().First((Type interfaceType) => interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == typeof(ICollection <>)).GetGenericArguments()[0]; result = (SerializationMethodsBase)typeof(CollectionSerializationMethodsChain <,>).MakeGenericType(type, elementType).GetConstructor(new Type[] { typeof(SerializationMethodsBase), typeof(bool) }).Invoke(new object[] { AddTypeDependence(elementType), false }); } else if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(KeyValuePair <,>)) { Type[] genericArgs = type.GetGenericArguments(); result = (SerializationMethodsBase)typeof(KeyValuePairSerializationMethodsChain <, ,>).MakeGenericType(type, genericArgs[0], genericArgs[1]).GetConstructor(new Type[] { typeof(SerializationMethodsBase), typeof(SerializationMethodsBase), typeof(bool) }).Invoke(new object[] { AddTypeDependence(genericArgs[0]), AddTypeDependence(genericArgs[1]), false }); } else { LocalCompilationContext compileContext = new LocalCompilationContext(type, this); compileQueue.Enqueue(compileContext); result = compileContext.serializationMethods; } } } Dependencies.Add(type, result); return(result); }