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