示例#1
0
 bool IMerger.TestKey(object source, object overrides, Type type, IMergeContext context)
 {
     if (object.Equals(source, overrides))
     {
         return true;
     }
     return _cache.GetOrAdd(type, key => new PropertyMergerImpl(key)).TestKey(source, overrides, context);
 }
示例#2
0
        public override void Merge(ref object source, object overrides, Type type, IMergeContext context)
        {
            var sourceJObj = source as JObject;
            if (sourceJObj != null && type == typeof(object))
            {
                var overridesDict = overrides as Dictionary<object, object>;
                if (overridesDict != null)
                {
                    Merge(sourceJObj, overridesDict, context);

                    // Stop merging since already merged by context merger
                    return;
                }
            }

            base.Merge(ref source, overrides, type, context);
        }
示例#3
0
 private void Merge(ref object source, object overrides, Type type, IMergeContext context)
 {
     if (source == null)
     {
         source = overrides;
         return;
     }
     if (type == typeof(string) || type == typeof(object))
     {
         source = overrides;
         return;
     }
     if (type.IsValueType)
     {
         source = overrides;
         return;
     }
     _cache.GetOrAdd(type, key => new PropertyMergerImpl(key)).Merge(ref source, overrides, context);
 }
示例#4
0
 private static void Merge(JObject source, Dictionary<object, object> overridesDict, IMergeContext context)
 {
     foreach (var or in overridesDict)
     {
         var overrideKey = or.Key as string;
         if (overrideKey != null)
         {
             object obj;
             JToken jToken;
             if (source.TryGetValue(overrideKey, out jToken))
             {
                 obj = jToken;
                 context.Merger.Merge(ref obj, or.Value, typeof(object), context);
             }
             else
             {
                 obj = or.Value;
             }
             source[overrideKey] = JToken.FromObject(obj);
         }
     }
 }
示例#5
0
 public void Merge(IEnumerable source, IEnumerable overrides, IMergeContext context)
 {
     foreach (var oi in overrides)
     {
         if (oi == null)
         {
             continue;
         }
         foreach (var si in source)
         {
             if (si == null)
             {
                 continue;
             }
             if (context.Merger.TestKey(si, oi, ElementType, context))
             {
                 object s = si;
                 context.Merger.Merge(ref s, oi, ElementType, context);
             }
         }
     }
 }
示例#6
0
        public override void Merge(ref object source, object overrides, Type type, IMergeContext context)
        {
            if (source is IEnumerable && type != typeof(string))
            {
                foreach (var it in type.GetInterfaces())
                {
                    if (it.IsGenericType &&
                        it.GetGenericTypeDefinition() == typeof(IEnumerable<>))
                    {
                        if (overrides == null)
                        {
                            return;
                        }
                        if (it.IsAssignableFrom(overrides.GetType()))
                        {
                            new ListMergerImpl(it.GetGenericArguments()[0]).Merge((IEnumerable)source, (IEnumerable)overrides, context);
                            return;
                        }
                    }
                }
            }

            base.Merge(ref source, overrides, type, context);
        }
示例#7
0
 public void Merge(IDictionary <TKey, TValue> source, IDictionary <TKey, TValue> overrides, IMergeContext context)
 {
     foreach (var oi in overrides)
     {
         if (source.TryGetValue(oi.Key, out TValue value))
         {
             object refObj = value;
             context.Merger.Merge(ref refObj, oi.Value, typeof(TValue), context);
             value = (TValue)refObj;
         }
         else
         {
             value = oi.Value;
         }
         source[oi.Key] = value;
     }
 }
            public void Merge(ref object source, object overrides, IMergeContext context)
            {
                if (overrides == null)
                {
                    return;
                }
                foreach (var prop in Props)
                {
                    switch (prop.Option)
                    {
                    case MergeOption.Merge:
                    case MergeOption.MergeNullOrDefault:
                    {
                        var s = prop.Prop.GetValue(source);
                        var o = prop.Prop.GetValue(overrides);
                        if (prop.Option == MergeOption.Merge)
                        {
                            if (o == null)
                            {
                                continue;
                            }
                            if (o.GetType().IsValueType)
                            {
                                var defaultValue = Activator.CreateInstance(o.GetType());
                                if (object.Equals(defaultValue, o))
                                {
                                    continue;
                                }
                            }
                        }
                        var oldS = s;
                        if (o == null)
                        {
                            s = o;
                        }
                        else if (prop.Handler != null)
                        {
                            prop.Handler.Merge(ref s, o, context);
                        }
                        else
                        {
                            context.Merger.Merge(ref s, o, prop.Prop.PropertyType, context);
                        }
                        if (!object.ReferenceEquals(s, oldS))
                        {
                            prop.Prop.SetValue(source, s);
                        }
                        continue;
                    }

                    case MergeOption.Replace:
                    case MergeOption.ReplaceNullOrDefault:
                    {
                        var s = prop.Prop.GetValue(source);
                        var o = prop.Prop.GetValue(overrides);
                        if (prop.Option == MergeOption.Replace)
                        {
                            if (o == null)
                            {
                                continue;
                            }
                            if (o.GetType().IsValueType)
                            {
                                var defaultValue = Activator.CreateInstance(o.GetType());
                                if (object.Equals(defaultValue, o))
                                {
                                    continue;
                                }
                            }
                        }
                        prop.Prop.SetValue(source, o);
                        continue;
                    }

                    default:
                        continue;
                    }
                }
            }
 void IMerger.Merge(ref object source, object overrides, Type type, IMergeContext context)
 {
     Merge(ref source, overrides, type, context);
 }
示例#10
0
 public void Merge(ref object source, object overrides, IMergeContext context)
 {
     if (overrides == null)
     {
         return;
     }
     foreach (var prop in Props)
     {
         switch (prop.Option)
         {
             case MergeOption.Merge:
             case MergeOption.MergeNullOrDefault:
                 {
                     var s = prop.Prop.GetValue(source);
                     var o = prop.Prop.GetValue(overrides);
                     if (prop.Option == MergeOption.Merge)
                     {
                         if (o == null)
                         {
                             continue;
                         }
                         if (o.GetType().IsValueType)
                         {
                             var defaultValue = Activator.CreateInstance(o.GetType());
                             if (object.Equals(defaultValue, o))
                             {
                                 continue;
                             }
                         }
                     }
                     var oldS = s;
                     if (o == null)
                     {
                         s = o;
                     }
                     else if (prop.Handler != null)
                     {
                         prop.Handler.Merge(ref s, o, context);
                     }
                     else
                     {
                         context.Merger.Merge(ref s, o, prop.Prop.PropertyType, context);
                     }
                     if (!object.ReferenceEquals(s, oldS))
                     {
                         prop.Prop.SetValue(source, s);
                     }
                     continue;
                 }
             case MergeOption.Replace:
             case MergeOption.ReplaceNullOrDefault:
                 {
                     var s = prop.Prop.GetValue(source);
                     var o = prop.Prop.GetValue(overrides);
                     if (prop.Option == MergeOption.Replace)
                     {
                         if (o == null)
                         {
                             continue;
                         }
                         if (o.GetType().IsValueType)
                         {
                             var defaultValue = Activator.CreateInstance(o.GetType());
                             if (object.Equals(defaultValue, o))
                             {
                                 continue;
                             }
                         }
                     }
                     prop.Prop.SetValue(source, o);
                     continue;
                 }
             default:
                 continue;
         }
     }
 }
示例#11
0
 public void Merge(ref object source, object overrides, IMergeContext context)
 {
     var s = (string)source;
     var o = (string)overrides;
     source = s + context["separator"] + o;
 }
示例#12
0
 void IMerger.Merge(ref object source, object overrides, Type type, IMergeContext context)
 {
     Merge(ref source, overrides, type, context);
 }
示例#13
0
 public bool TestKey(object source, object overrides, IMergeContext context)
 {
     if (overrides == null)
     {
         return false;
     }
     return Props.Where(p => p.Option == MergeOption.MergeKey).All(p =>
     {
         var s = p.Prop.GetValue(source);
         var o = p.Prop.GetValue(overrides);
         return object.Equals(s, o);
     });
 }
示例#14
0
 public virtual bool TestKey(object source, object overrides, Type type, IMergeContext context)
 {
     return(_inner.TestKey(source, overrides, type, context));
 }
示例#15
0
 public virtual bool TestKey(object source, object overrides, Type type, IMergeContext context)
 {
     return _inner.TestKey(source, overrides, type, context);
 }
示例#16
0
 public virtual void Merge(ref object source, object overrides, Type type, IMergeContext context)
 {
     _inner.Merge(ref source, overrides, type, context);
 }
示例#17
0
 private static void Merge(JObject source, Dictionary <object, object> overridesDict, IMergeContext context)
 {
     foreach (var or in overridesDict)
     {
         var overrideKey = or.Key as string;
         if (overrideKey != null)
         {
             object obj;
             JToken jToken;
             if (source.TryGetValue(overrideKey, out jToken))
             {
                 obj = jToken;
                 context.Merger.Merge(ref obj, or.Value, typeof(object), context);
             }
             else
             {
                 obj = or.Value;
             }
             source[overrideKey] = JToken.FromObject(obj);
         }
     }
 }
示例#18
0
 public void Merge(object source, object overrides, IMergeContext context)
 {
     Merge((IDictionary <TKey, TValue>)source, (IDictionary <TKey, TValue>)overrides, context);
 }
示例#19
0
 public virtual void Merge(ref object source, object overrides, Type type, IMergeContext context)
 {
     _inner.Merge(ref source, overrides, type, context);
 }