private CodeExpression SerializeInstanceDescriptor (IDesignerSerializationManager manager, InstanceDescriptor descriptor) { CodeExpression expression = null; MemberInfo member = descriptor.MemberInfo; CodeExpression target = new CodeTypeReferenceExpression (member.DeclaringType); if (member is PropertyInfo) { expression = new CodePropertyReferenceExpression (target, member.Name); } else if (member is FieldInfo) { expression = new CodeFieldReferenceExpression (target, member.Name); } else if (member is MethodInfo) { CodeMethodInvokeExpression methodInvoke = new CodeMethodInvokeExpression (target, member.Name); manager.Context.Push (new ExpressionContext (methodInvoke, methodInvoke.GetType (), null, null)); if (descriptor.Arguments != null && descriptor.Arguments.Count > 0) methodInvoke.Parameters.AddRange (SerializeParameters (manager, descriptor.Arguments)); manager.Context.Pop (); expression = methodInvoke; } else if (member is ConstructorInfo) { CodeObjectCreateExpression createExpr = new CodeObjectCreateExpression (member.DeclaringType); manager.Context.Push (new ExpressionContext (createExpr, createExpr.GetType (), null, null)); if (descriptor.Arguments != null && descriptor.Arguments.Count > 0) createExpr.Parameters.AddRange (SerializeParameters (manager, descriptor.Arguments)); manager.Context.Pop (); expression = createExpr; } return expression; }
protected virtual object SerializeCollection (IDesignerSerializationManager manager, CodeExpression targetExpression, Type targetType, ICollection originalCollection, ICollection valuesToSerialize) { if (valuesToSerialize == null) throw new ArgumentNullException ("valuesToSerialize"); if (originalCollection == null) throw new ArgumentNullException ("originalCollection"); if (targetType == null) throw new ArgumentNullException ("targetType"); if (manager == null) throw new ArgumentNullException ("manager"); if (valuesToSerialize.Count == 0) return null; MethodInfo method = null; try { object sampleParam = null; IEnumerator e = valuesToSerialize.GetEnumerator (); e.MoveNext (); sampleParam = e.Current; // try to find a method matching the type of the sample parameter. // Assuming objects in the collection are from the same base type method = GetExactMethod (targetType, "Add", new object [] { sampleParam }); } catch { Console.WriteLine ("SerializeCollection: No compatible Add method found in " + targetType); } if (method == null) return null; CodeStatementCollection statements = new CodeStatementCollection (); foreach (object value in valuesToSerialize) { CodeMethodInvokeExpression methodInvoke = new CodeMethodInvokeExpression (); methodInvoke.Method = new CodeMethodReferenceExpression (targetExpression, "Add"); manager.Context.Push (new ExpressionContext (methodInvoke, methodInvoke.GetType (), null, originalCollection)); CodeExpression expression = base.SerializeToExpression (manager, value); if (expression == null) { Console.WriteLine ("SerializeCollection: Unable to serialize " + value); methodInvoke = null; } else { methodInvoke.Parameters.AddRange (new CodeExpression[] { expression }); } manager.Context.Pop (); if (methodInvoke != null) statements.Add (methodInvoke); } return statements; }