private ApiModel ResolveApiArray(JsonArrayContract jsonArrayContract) { return(new ApiArray( type: jsonArrayContract.UnderlyingType, itemType: jsonArrayContract.CollectionItemType ?? typeof(object))); }
private static void PopulateArray(JArray jArray, JsonArrayContract arrayContract, IList source, IList target) { if (target.Count > 0 && target is IEnumerable <DirtyExtensibleObject> targetEnumerable) { var objectContract = (JsonObjectContract)InternalPrivateContractResolver.ResolveContract(arrayContract.CollectionItemType); var sourceEnumerable = (IEnumerable <DirtyExtensibleObject>)source; for (var i = target.Count - 1; i >= 0; --i) { var targetItem = (DirtyExtensibleObject)target[i]; var id = ((IIdentifiable)targetItem)?.Id; if (!string.IsNullOrEmpty(id) && Extensions.IndexOf(sourceEnumerable, id) < 0) { target.RemoveAt(i); targetItem.ClearPropertyChangedEvent(); } } for (var i = 0; i < source.Count; ++i) { var sourceItem = (DirtyExtensibleObject)source[i]; var id = ((IIdentifiable)sourceItem)?.Id; DirtyExtensibleObject existing = null; if (!string.IsNullOrEmpty(id)) { var index = Extensions.IndexOf(targetEnumerable, id); if (index >= 0) { existing = (DirtyExtensibleObject)target[index]; } } if (existing != null) { var index = i; while (!ReferenceEquals(target[index], existing)) { ++index; } if (index > i) { for (var j = i; j < index; ++j) { target[j + 1] = target[j]; } target[i] = existing; } } else { if (i == target.Count) { target.Add(sourceItem); } else { existing = (DirtyExtensibleObject)target[i]; if (!string.IsNullOrEmpty(((IIdentifiable)existing)?.Id)) { target.Insert(i, sourceItem); existing = null; } } } if (existing != null) { PopulateObject((JObject)jArray[i], objectContract, sourceItem, existing); } } for (var i = target.Count - 1; i >= source.Count; --i) { var targetItem = (DirtyExtensibleObject)target[i]; target.RemoveAt(i); targetItem.ClearPropertyChangedEvent(); } } else { target.Clear(); foreach (var item in source) { target.Add(item); } } }
public static bool IsSelfReferencing(this JsonArrayContract arrayContract) { return(arrayContract.UnderlyingType == arrayContract.CollectionItemType); }