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