public void Map(ref object local, DiffPart diff, MapContext context) { if (context.Path.Count == 0) { switch (diff.DiffType) { case DiffPartType.Create: local = diff.Value; break; case DiffPartType.Remove: local = null; break; case DiffPartType.Resize: ResizeArray(ref local, (int)diff.Value); break; } } else { switch (diff.DiffType) { case DiffPartType.Include: var index = int.Parse(context.Path.Pop()); Type elementType = context.Type.GetElementType(); var array = (Array)local; object arrValue = array.GetValue(index); context.Resolvers.FindResolver(elementType).Map(ref arrValue, diff, new MapContext(context, elementType)); array.SetValue(arrValue, index); break; } } }
public void Map(ref object local, DiffPart diff, MapContext context) { if (context.Path.Count == 0) { local = diff.DiffType == DiffPartType.Exclude ? TypeHelpers.CreateDefaultState(context.Type) : diff.Value; } else { var member = TypeMemberInfo.GetPublicMember(local.GetType(), context.Path.Pop() as string); var fi = member as FieldInfo; if (fi != null) { object fieldLocal = fi.GetValue(local); Type type = (fieldLocal == null) ? fi.FieldType : fieldLocal.GetType(); if (diff.DiffType == DiffPartType.Exclude) { if (context.Path.Count == 0) { fi.SetValue(local, TypeHelpers.CreateDefaultState(type)); } else { context.Resolvers.FindResolver(type).Map(ref fieldLocal, diff, new MapContext(context, type)); // fi.SetValue(local, fieldLocal); } } else { context.Resolvers.FindResolver(type).Map(ref fieldLocal, diff, new MapContext(context, type)); fi.SetValue(local, fieldLocal); } } var pi = member as PropertyInfo; if (pi != null) { object propertyLocal = pi.GetValue(local); Type type = (propertyLocal == null) ? pi.PropertyType : propertyLocal.GetType(); if (diff.DiffType == DiffPartType.Exclude) { if (context.Path.Count == 0) { pi.SetValue(local, TypeHelpers.CreateDefaultState(pi.PropertyType)); } else { context.Resolvers.FindResolver(type).Map(ref propertyLocal, diff, new MapContext(context, type)); // pi.SetValue(local, propertyLocal); } } else { context.Resolvers.FindResolver(type).Map(ref propertyLocal, diff, new MapContext(context, type)); pi.SetValue(local, propertyLocal); } } } }
public MapContext(ResolverMap resolversMap, DiffPart diff, Type type) { Resolvers = resolversMap; Path = new Stack <string>(); Type = type; while (diff.Path.Count > 0) { Path.Push(diff.Path.Pop()); } }
public void Map(ref object local, DiffPart diff, MapContext context) { var list = (IList)local; if (context.Path.Count == 0) { switch (diff.DiffType) { case DiffPartType.Create: local = diff.Value; break; case DiffPartType.Remove: local = null; break; case DiffPartType.Resize: while (list.Count > (int)diff.Value) { list.RemoveAt(list.Count - 1); } break; case DiffPartType.Include: list.Add(diff.Value); break; } } else { switch (diff.DiffType) { case DiffPartType.Include: int index = Convert.ToInt32(context.Path.Pop()); object listValue = list[index]; Type[] arguments = context.Type.GetGenericArguments(); Type elementType = arguments[0]; context.Resolvers.FindResolver(elementType).Map(ref listValue, diff, new MapContext(context, elementType)); list[index] = listValue; break; } } }
public void Map(ref object local, DiffPart diff, MapContext context) { switch (diff.DiffType) { case DiffPartType.Create: local = diff.Value; break; case DiffPartType.Remove: local = null; break; case DiffPartType.Exclude: Remove(local, diff.Value); break; case DiffPartType.Include: Add(local, diff.Value); break; } }
public static string GetMonacoDiffUrl(this DiffPart part) { var uri = part.Left?.Uri ?? part.Right?.Uri; return($"monaco/diff.html?part={HttpUtility.UrlEncode(uri)}"); }
public void Map(ref object local, DiffPart diff, MapContext context) { local = diff.DiffType == DiffPartType.Exclude ? null : diff.Value; }
public void Map(ref object local, DiffPart diff, MapContext context) { new ClassResolver().Map(ref local, diff, context); }
public void Map(ref object local, DiffPart diff, MapContext context) { local = diff.Value; }
public void Map(ref object local, DiffPart diff, MapContext context) { if (context.Path.Count == 0) { switch (diff.DiffType) { case DiffPartType.Create: local = diff.Value; break; case DiffPartType.Remove: local = null; break; } } else { if (local == null) { local = TypeHelpers.CreateInitialState(context.Type); } var localDict = (IDictionary)local; var key = ObjSerializer.Deserialize(context.Path.Pop()); if (context.Path.Count == 0) { switch (diff.DiffType) { case DiffPartType.Exclude: if (localDict.Contains(key)) { localDict.Remove(key); } break; case DiffPartType.Include: if (localDict.Contains(key)) { localDict[key] = diff.Value; } else { localDict.Add(key, diff.Value); } break; } } else { if (localDict.Contains(key)) { Type[] arguments = context.Type.GetGenericArguments(); Type valueType = arguments[1]; var value = localDict[key]; context.Resolvers.FindResolver(valueType).Map(ref value, diff, new MapContext(context, valueType)); localDict[key] = value; } else { // Ключ обязан быть в словаре, т.к. движение к изменяемой части не завершено throw new InvalidOperationException("Not found key " + (key ?? String.Empty)); } } } }