Beispiel #1
0
        private CodeStatementCollection CreateCollectionInitialization(CodeExpression propertyExpression, object parentInstance, PropertyDescriptor property)
        {
            // get collection and define expressions.
            ICollection collection = property.GetValue(parentInstance) as ICollection;

            CodeStatement[] expressions = new CodeStatement[collection.Count];

            int counter = 0;
            int maximum = expressions.Length;

            foreach (object value in collection)
            {
                // format value.
                var formattedValue = CodeDomTypeFormatter.FormatValue(value);

                if (formattedValue == null)
                {
                    // remove from list.
                    maximum--;
                }
                else
                {
                    // create property.Add(value) statement.
                    expressions[counter] = CodeDomTypeFormatter.CreateAddToCollectionExpression(propertyExpression, formattedValue);
                    counter++;
                }
            }

            if (maximum != expressions.Length)
            {
                Array.Resize(ref expressions, maximum);
            }

            return(new CodeStatementCollection(expressions));
        }
Beispiel #2
0
        /// <summary>
        /// Serializes a specific property to code.
        /// </summary>
        /// <param name="instanceHolder">The parent expression that holds the instance.</param>
        /// <param name="instance">The instance to take away the values from.</param>
        /// <param name="property">The property to serialize.</param>
        /// <returns>A collection of code statements initiating the given property of the given object to its value.</returns>
        public CodeStatementCollection SerializeProperty(CodeExpression instanceHolder, object instance, PropertyDescriptor property)
        {
            CodeStatementCollection statements = new CodeStatementCollection();

            var propertyExpression = new CodePropertyReferenceExpression(
                instanceHolder,
                property.Name);

            object propertyValue = property.GetValue(instance);

            if (property.PropertyType.HasInterface(typeof(ICollection)))
            {
                // If collection, create property.Add(...) statements.
                statements.AddRange(CreateCollectionInitialization(propertyExpression, instance, property));
            }
            else if (CodeDomTypeFormatter.IsFormattableWithAssignment(property.PropertyType))
            {
                // else, create normal property = value statement.
                statements.Add(CreatePropertyAssignmentExpression(propertyExpression, instance, property));
            }

            if (!CodeDomTypeFormatter.IsFormattableWithAssignment(property.PropertyType))
            {
                // serialize child properties.
                if (property.PropertyType.IsValueType)
                {
                    // value types uses a temp var.to access properties.
                    statements.AddRange(CreateValueTypeInitialization(propertyExpression, instance, property));
                }
                else
                {
                    // access properties directly.
                    statements.AddRange(SerializeProperties(propertyExpression, propertyValue));
                }
            }

            return(statements);
        }
Beispiel #3
0
        private CodeAssignStatement CreatePropertyAssignmentExpression(CodeExpression propertyExpression, object parentInstance, PropertyDescriptor property)
        {
            CodeExpression valueExpression = CodeDomTypeFormatter.FormatValue(property.GetValue(parentInstance));

            return(new CodeAssignStatement(propertyExpression, valueExpression));
        }
Beispiel #4
0
        private CodeStatementCollection CreateValueTypeInitialization(CodeExpression propertyExpression, object parentInstance, PropertyDescriptor property)
        {
            // value types (structs) cannot be modified from a property, so we need to create a temp var.
            string tempVariable  = CreateNewVariable(property.PropertyType);
            object propertyValue = property.GetValue(parentInstance);

            CodeStatementCollection statements = new CodeStatementCollection();

            // declare temp var.
            statements.Add(new CodeVariableDeclarationStatement(property.PropertyType, tempVariable, CodeDomTypeFormatter.FormatValue(propertyValue)));

            CodeVariableReferenceExpression varReference = new CodeVariableReferenceExpression(tempVariable);

            // serialize properties of var.
            statements.AddRange(SerializeProperties(varReference, propertyValue));

            // set property to var.
            statements.Add(new CodeAssignStatement(propertyExpression, varReference));

            return(statements);
        }