/// <summary> /// Generates an expression tree to handle ExpandoObject serialization /// </summary> /// <param name="type">Type of <paramref name="objToSerialize"/></param> /// <param name="variables">Global variables for the expression tree</param> /// <param name="outputStream">Stream to write to</param> /// <param name="objToSerialize">Object to serialize</param> /// <param name="objTracking">Reference tracker</param> /// <returns>An expression tree to handle ExpandoObject serialization</returns> public static Expression GenerateExpandoObjectExpression(Type type, List <ParameterExpression> variables, ParameterExpression outputStream, ParameterExpression objToSerialize, ParameterExpression objTracking) { var enumerableType = typeof(IEnumerable <KeyValuePair <string, object> >); var getEnumeratorMethodInfo = IEnumerableMih.GetEnumerator <string, object>(); var enumeratorMethod = Expression.Call(Expression.Convert(objToSerialize, enumerableType), getEnumeratorMethodInfo); var loopBodyCargo = new EnumerableLoopBodyCargo(); loopBodyCargo.EnumeratorType = typeof(IEnumerator <KeyValuePair <string, object> >); loopBodyCargo.KvpType = typeof(KeyValuePair <string, object>); var preLoopActions = new List <Expression>(); preLoopActions.Add(PrimitiveHelpers.WriteInt32(outputStream, Expression.Property(Expression.Convert(objToSerialize, typeof(ICollection <KeyValuePair <string, object> >)), CollectionMih.Count <KeyValuePair <string, object> >()), objTracking)); var notTrackedExpressions = new List <Expression>(); notTrackedExpressions.Add(Expression.Call(objTracking, SerializerObjectTrackerMih.TrackObject(), objToSerialize)); notTrackedExpressions.Add(EnumerableLoopHelper.GenerateEnumeratorLoop(variables, EnumerableLoopHelper.GetStringToSomethingWriter(outputStream, objTracking), enumeratorMethod, preLoopActions, loopBodyCargo)); return(Serializer.GenerateNullTrackedOrUntrackedExpression(type, outputStream, objToSerialize, objTracking, notTrackedExpressions, variables)); }
/// <summary> /// Generate an expression tree that clones ExpandoObject /// </summary> /// <param name="variables">Global variables for the expression tree</param> /// <param name="source">Source object</param> /// <param name="clone">Clone object</param> /// <param name="refTrackerParam">Reference tracker</param> /// <returns>An expression tree that clones ExpandoObject</returns> public static Expression GenerateExpandoObjectExpression(List <ParameterExpression> variables, ParameterExpression source, ParameterExpression clone, ParameterExpression refTrackerParam) { var enumerableType = typeof(IEnumerable <KeyValuePair <string, object> >); var getEnumeratorMethodInfo = IEnumerableMih.GetEnumerator <string, object>(); var enumeratorMethod = Expression.Call(Expression.Convert(source, enumerableType), getEnumeratorMethodInfo); var dictType = typeof(IDictionary <string, object>); var cloneAsDict = Expression.Parameter(dictType, "cloneDict"); var expressions = new List <Expression>(); variables.Add(cloneAsDict); expressions.Add(Expression.Assign(clone, Expression.New(typeof(ExpandoObject)))); expressions.Add(Expression.Assign(cloneAsDict, Expression.Convert(clone, dictType))); expressions.Add(Expression.Call(refTrackerParam, ObjectClonerReferenceTrackerMih.Track(), source, clone)); var loopBodyCargo = new EnumerableLoopBodyCargo(); loopBodyCargo.EnumeratorType = typeof(IEnumerator <KeyValuePair <string, object> >); loopBodyCargo.KvpType = typeof(KeyValuePair <string, object>); expressions.Add(EnumerableLoopHelper.GenerateEnumeratorLoop(variables, CloneKeyValuePair(clone, refTrackerParam), enumeratorMethod, null, loopBodyCargo)); return(ObjectCloner.GenerateNullTrackedOrUntrackedExpression(source, clone, typeof(ExpandoObject), refTrackerParam, Expression.Block(expressions))); }