/// <summary>
        /// Build object from change tracker.
        /// </summary>
        /// <param name="changeTracker">Change tracker.</param>
        /// <param name="appendOdataType">Append odata type.</param>
        /// <param name="odataType">odata type.</param>
        /// <returns></returns>
        private JObject BuildObjectFromIPropertyChangeTracking(IPropertyChangeTracking changeTracker, bool appendOdataType = false, string odataType = null)
        {
            JObject jObject = new JObject();

            if (appendOdataType)
            {
                if (!string.IsNullOrEmpty(odataType))
                {
                    jObject["@odata.type"] = odataType;
                }
            }

            foreach (PropertyDefinition changedProperty in changeTracker.GetChangedProperties())
            {
                object propertyValue = changeTracker[changedProperty];
                if (changedProperty.ChangeTrackable)
                {
                    if (changedProperty.IsEnumerable)
                    {
                        IList <object> list = changedProperty.ActivateList(changeTracker[changedProperty]);

                        JArray jArray = new JArray();
                        foreach (object entry in list)
                        {
                            jArray.Add(
                                this.BuildObjectFromIPropertyChangeTracking(
                                    entry as IPropertyChangeTracking,
                                    changedProperty.IEnumerableUnderlyingType.IsAbstract,
                                    changeTracker["ODataType"] as string));
                        }

                        jObject.Add(
                            changedProperty.Name,
                            jArray);
                    }
                    else
                    {
                        jObject[changedProperty.Name] = JToken.FromObject(
                            this.BuildObjectFromIPropertyChangeTracking(propertyValue as IPropertyChangeTracking,
                                                                        changedProperty.Type.IsAbstract,
                                                                        changeTracker["ODataType"] as string),
                            this.StringEnumSerializer);
                    }
                }
                else
                {
                    jObject[changedProperty.Name] = JToken.FromObject(
                        propertyValue,
                        this.StringEnumSerializer);
                }
            }

            return(jObject);
        }
Exemple #2
0
        /// <summary>
        /// Serialize Property change tracking contract.
        /// </summary>
        /// <param name="obj">Object to serialize.</param>
        /// <param name="additionalProperties">Additional properties to serialize.</param>
        /// <param name="appendRootObject">Append root object name.</param>
        /// <returns></returns>
        public string Serialize(IPropertyChangeTracking obj, Dictionary <string, object> additionalProperties, bool appendRootObject = true)
        {
            /*
             * Two behaviors appendRootObject covers.
             * 1. appendRootObject = false
             *
             *  {
             *      "Property1": "Value",
             *      "Property2": "Value",
             *      etc..
             *  }
             *
             *  2. appendRootObject = true
             *  It appends object name. For an instance, object Message with two properties
             *
             *  {
             *      "message": {
             *          "Property1": "Value",
             *          "Property2": "Value",
             *          etc...
             *      }
             *  }
             */

            JObject rootObject = new JObject();

            if (appendRootObject)
            {
                rootObject.Add(
                    obj.GetType().Name,
                    this.BuildObjectFromIPropertyChangeTracking(obj));
            }
            else
            {
                rootObject = this.BuildObjectFromIPropertyChangeTracking(obj);
            }

            // Additional properties aren't part of initial object, for example "Comment" in SendMail.
            if (null != additionalProperties && additionalProperties.Count > 0)
            {
                foreach (KeyValuePair <string, object> additionalProperty in additionalProperties)
                {
                    // Outlook api is case sensitive with parameters so
                    // caps first letter. Other casing is ok from generated
                    // model. Graph doesn't care about casing.
                    rootObject.Add(
                        this.CapsFirstLetter(additionalProperty.Key),
                        JToken.FromObject(additionalProperty.Value));
                }
            }

            return(JsonConvert.SerializeObject(rootObject));
        }
Exemple #3
0
        private JObject BuildObjectFromIPropertyChangeTracking(IPropertyChangeTracking obj, bool appendODataType = false, string odataType = null)
        {
            JObject jObject = new JObject();

            if (appendODataType)
            {
                if (!string.IsNullOrEmpty(odataType))
                {
                    jObject["@odata.type"] = odataType;
                }
            }

            foreach (PropertyDefinition changedProperty in obj.GetChangedProperies())
            {
                object property = obj[changedProperty];
                if (changedProperty.ChangeTrackable)
                {
                    jObject[changedProperty.Name] = JToken.FromObject(
                        this.BuildObjectFromIPropertyChangeTracking(property as IPropertyChangeTracking,
                                                                    changedProperty.Type.IsAbstract,
                                                                    changedProperty.GetODataType(property)),
                        this.StringEnumSerializer);
                }
                else if (changedProperty.ListChangeTrackable)
                {
                    IList <object> list   = changedProperty.ActivateIList(obj[changedProperty]);
                    JArray         jArray = new JArray();
                    foreach (object entry in list)
                    {
                        jArray.Add(
                            this.BuildObjectFromIPropertyChangeTracking(
                                entry as IPropertyChangeTracking,
                                changedProperty.GetListUnderlyingType().IsAbstract,
                                changedProperty.GetODataType(entry)));
                    }

                    jObject.Add(
                        changedProperty.Name,
                        jArray);
                }
                else
                {
                    jObject[changedProperty.Name] = JToken.FromObject(
                        property,
                        this.StringEnumSerializer);
                }
            }

            return(jObject);
        }
        /// <summary>
        /// Serialize property change tracking to string.
        /// </summary>
        /// <param name="changeTracker">Change tracker.</param>
        /// <param name="additionalProperties">Additional properties.</param>
        /// <param name="appendRootObject">Append root object.</param>
        /// <returns></returns>
        internal string Convert(IPropertyChangeTracking changeTracker, Dictionary <string, object> additionalProperties, bool appendRootObject = true)
        {
            /*
             * Two behaviors appendRootObject covers.
             * 1. appendRootObject = false
             *
             *  {
             *      "Property1": "Value",
             *      "Property2": "Value",
             *      etc..
             *  }
             *
             *  2. appendRootObject = true
             *  It appends object name. For an instance, object Message with two properties
             *
             *  {
             *      "message": {
             *          "Property1": "Value",
             *          "Property2": "Value",
             *          etc...
             *      }
             *  }
             */

            JObject rootObject = new JObject();

            if (appendRootObject)
            {
                rootObject.Add(
                    changeTracker.GetType().Name,
                    this.BuildObjectFromIPropertyChangeTracking(changeTracker));
            }
            else
            {
                rootObject = this.BuildObjectFromIPropertyChangeTracking(changeTracker);
            }

            // Additional properties aren't part of initial object, for example "Comment" in SendMail.
            if (null != additionalProperties && additionalProperties.Count > 0)
            {
                foreach (KeyValuePair <string, object> additionalProperty in additionalProperties)
                {
                    rootObject.Add(
                        additionalProperty.Key,
                        JToken.FromObject(additionalProperty.Value));
                }
            }

            return(JsonConvert.SerializeObject(rootObject));
        }
 /// <summary>
 /// Convert change trackable object to string.
 /// </summary>
 /// <param name="changeTracker"></param>
 /// <param name="additionalProperties"></param>
 /// <param name="appendRootObject"></param>
 /// <returns></returns>
 private string Convert(IPropertyChangeTracking changeTracker, Dictionary <string, object> additionalProperties = null, bool appendRootObject = true)
 {
     return(ConverterTests.converter.Convert(changeTracker, additionalProperties, appendRootObject));
 }