Пример #1
0
        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;
                }
            }
        }
Пример #2
0
        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);
                    }
                }
            }
        }
Пример #3
0
 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());
     }
 }
Пример #4
0
        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;
                }
            }
        }
Пример #5
0
        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;
            }
        }
Пример #6
0
        public static string GetMonacoDiffUrl(this DiffPart part)
        {
            var uri = part.Left?.Uri ?? part.Right?.Uri;

            return($"monaco/diff.html?part={HttpUtility.UrlEncode(uri)}");
        }
Пример #7
0
 public void Map(ref object local, DiffPart diff, MapContext context)
 {
     local = diff.DiffType == DiffPartType.Exclude ? null : diff.Value;
 }
Пример #8
0
 public void Map(ref object local, DiffPart diff, MapContext context)
 {
     new ClassResolver().Map(ref local, diff, context);
 }
Пример #9
0
 public void Map(ref object local, DiffPart diff, MapContext context)
 {
     local = diff.Value;
 }
Пример #10
0
        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));
                    }
                }
            }
        }