public DiffChain Resolve(object local, object remote, ResolveContext context) { if (local == null && remote == null) { return(DiffChain.Empty()); } var remoteIp = remote as IPEndPoint; var localIp = local as IPEndPoint; var result = new DiffChain(); if (remoteIp == null) { result.Add(context.CreateDiffFromCurrentPath()); } else if (localIp == null) { result.Add(context.CreateDiffFromCurrentPath(remote)); } else if (remoteIp.Port != localIp.Port || remoteIp.Address.ToString() != localIp.Address.ToString()) { result.Add(context.CreateDiffFromCurrentPath(remote)); } result.Lock(); return(result); }
public DiffChain Resolve(object local, object remote, ResolveContext context) { if (local == null && remote == null) { return(DiffChain.Empty()); } var remoteFont = remote as Font; var localFont = local as Font; var result = new DiffChain(); if (remoteFont == null) { result.Add(context.CreateDiffFromCurrentPath()); } else if (localFont == null) { result.Add(context.CreateDiffFromCurrentPath(remote)); } else if (!(Equals(remoteFont, localFont))) { result.Add(context.CreateDiffFromCurrentPath(remote)); } result.Lock(); return(result); }
public DiffChain Resolve(object local, object remote, ResolveContext context) { if (local == null && remote == null) { return(DiffChain.Empty()); } var remoteUri = remote as Uri; var localUri = local as Uri; var result = new DiffChain(); if (remoteUri == null) { result.Add(context.CreateDiffFromCurrentPath()); } else if (localUri == null) { result.Add(context.CreateDiffFromCurrentPath(remote)); } else if (remoteUri.OriginalString != localUri.OriginalString) { result.Add(context.CreateDiffFromCurrentPath(remote)); } result.Lock(); return(result); }
public DiffChain Resolve(object local, object remote, ResolveContext context) { if (local == null && remote == null) { return(DiffChain.Empty()); } IEnumerable <MemberInfo> members = TypeMemberInfo.GetAllPublicMembers(context.Type); var result = new DiffChain(); if (local == null) { result.Add(context.CreateDiffFromCurrentPath(remote)); } else if (remote == null) { result.Add(context.CreateDiffFromCurrentPath()); } else { foreach (var member in members) { if (IgnoreMembersLogic.IgnoredByAttribute(context.Options, member)) { continue; } var fi = member as FieldInfo; if (fi != null) { var fieldLocal = fi.GetValue(local); var fieldRemote = fi.GetValue(remote); var memberType = GetType(fieldLocal, fieldRemote); if (memberType != null) { result.Add(context.Resolvers.FindResolver(memberType).Resolve(fieldLocal, fieldRemote, new ResolveContext(context, member.Name, memberType))); } continue; } var pi = member as PropertyInfo; if (pi != null) { var propertyLocal = pi.GetValue(local); var propertyRemote = pi.GetValue(remote); var memberType = GetType(propertyLocal, propertyRemote); if (memberType != null) { result.Add(context.Resolvers.FindResolver(memberType).Resolve(propertyLocal, propertyRemote, new ResolveContext(context, member.Name, memberType))); } } } } result.Lock(); return(result); }
public DiffChain Resolve(object local, object remote, ResolveContext context) { if (local == null && remote == null) { return(DiffChain.Empty()); } var result = new DiffChain(); if (local == null) { result.Add(context.CreateDiffFromCurrentPath(remote, DiffPartType.Create)); } else if (remote == null) { result.Add(context.CreateDiffFromCurrentPath(DiffPartType.Remove)); } else { var remoteDict = (IDictionary)remote; var localDict = (IDictionary)local; var remoteEnumerator = remoteDict.GetEnumerator(); var localEnumerator = localDict.GetEnumerator(); Type[] arguments = context.Type.GetGenericArguments(); Type valueType = arguments[1]; // Удаление элементов, по ключам отсутствующем в конечном состоянии while (localEnumerator.MoveNext()) { if (!remoteDict.Contains(localEnumerator.Key)) { result.Add(new ResolveContext(context, ObjSerializer.Serialize(localEnumerator.Key), valueType).CreateDiffFromCurrentPath()); } } // Определение новых элементов и сравнение пересекающихся по ключам while (remoteEnumerator.MoveNext()) { if (localDict.Contains(remoteEnumerator.Key)) { var remoteValue = remoteEnumerator.Value; var localValue = localDict[remoteEnumerator.Key]; result.Add(context.Resolvers.FindResolver(valueType).Resolve(localValue, remoteValue, new ResolveContext(context, ObjSerializer.Serialize(remoteEnumerator.Key), valueType))); } else { result.Add(new ResolveContext(context, ObjSerializer.Serialize(remoteEnumerator.Key), valueType).CreateDiffFromCurrentPath(remoteEnumerator.Value)); } } } result.Lock(); return(result); }
public DiffChain Resolve(object local, object remote, ResolveContext context) { if (local == null && remote == null) { return(DiffChain.Empty()); } if (String.Compare((string)local, (string)remote, StringComparison.Ordinal) != 0) { var result = new DiffChain { remote == null ? context.CreateDiffFromCurrentPath() : context.CreateDiffFromCurrentPath(remote) }; result.Lock(); return(result); } return(DiffChain.Empty()); }
public DiffChain Resolve(object local, object remote, ResolveContext context) { if (local == null && remote == null) { return(DiffChain.Empty()); } var result = new DiffChain(); if (local == null) { result.Add(context.CreateDiffFromCurrentPath(remote, DiffPartType.Create)); } else if (remote == null) { result.Add(context.CreateDiffFromCurrentPath(DiffPartType.Remove)); } else { var localEnumerator = (IList)local; var remoteEnumerator = (IList)remote; // Сравнение пересекающихся частей Type[] arguments = context.Type.GetGenericArguments(); Type elementType = arguments[0]; var compareCount = Math.Min(localEnumerator.Count, remoteEnumerator.Count); for (int i = 0; i < compareCount; i++) { result.Add(context.Resolvers.FindResolver(elementType).Resolve(localEnumerator[i], remoteEnumerator[i], new ResolveContext(context, i.ToString(), elementType))); } if (localEnumerator.Count < remoteEnumerator.Count) { for (int i = compareCount; i < remoteEnumerator.Count; i++) { result.Add(context.CreateDiffFromCurrentPath(remoteEnumerator[i])); } } else if (localEnumerator.Count > remoteEnumerator.Count) { result.Add(context.CreateDiffFromCurrentPath(remoteEnumerator.Count, DiffPartType.Resize)); } } result.Lock(); return(result); }
public DiffChain Resolve(object local, object remote, ResolveContext context) { if (local == null && remote == null) { return(DiffChain.Empty()); } var result = new DiffChain(); if (local == null) { result.Add(context.CreateDiffFromCurrentPath(remote, DiffPartType.Create)); } else if (remote == null) { result.Add(context.CreateDiffFromCurrentPath(DiffPartType.Remove)); } else { var lArr = (Array)local; var rArr = (Array)remote; var compareCount = Math.Min(lArr.Length, rArr.Length); Type elementType = context.Type.GetElementType(); // Сравнение пересекающейся части for (int i = 0; i < compareCount; i++) { result.Add(context.Resolvers.FindResolver(elementType).Resolve(lArr.GetValue(i), rArr.GetValue(i), new ResolveContext(context, i.ToString(), elementType))); } if (lArr.Length != rArr.Length) { result.Add(context.CreateDiffFromCurrentPath(rArr.Length, DiffPartType.Resize)); if (lArr.Length < rArr.Length) { for (int i = compareCount; i < rArr.Length; i++) { result.Add(new ResolveContext(context, i.ToString(), elementType).CreateDiffFromCurrentPath(rArr.GetValue(i))); } } } } result.Lock(); return(result); }
public DiffChain Resolve(object local, object remote, ResolveContext context) { if (local == null && remote == null) { return(DiffChain.Empty()); } var result = new DiffChain(); if (local == null) { result.Add(context.CreateDiffFromCurrentPath(remote, DiffPartType.Create)); } else if (remote == null) { result.Add(context.CreateDiffFromCurrentPath(DiffPartType.Remove)); } else { IEnumerator remoteEnumerator = GetEnumerator(remote); IEnumerator localEnumerator = GetEnumerator(local); while (localEnumerator.MoveNext()) { if (!Contains(remote, localEnumerator.Current)) { result.Add(context.CreateDiffFromCurrentPath(localEnumerator.Current, DiffPartType.Exclude)); } } while (remoteEnumerator.MoveNext()) { if (!Contains(local, remoteEnumerator.Current)) { result.Add(new ResolveContext(context, "", context.Type).CreateDiffFromCurrentPath(remoteEnumerator.Current)); } } } result.Lock(); return(result); }