public void ClonedDictionaryShouldBeOfSameType()
        {
            var target = new DictionaryCloner();

            var original = new SortedDictionary<string, object>();
            var clone = target.CloneDictionary(original);
            Assert.AreNotSame(original, clone);
            Assert.IsInstanceOf<SortedDictionary<string,object>>(clone);
        }
Example #2
0
        public void ClonedDictionaryShouldBeOfSameType()
        {
            var target = new DictionaryCloner();

            var original = new SortedDictionary <string, object>();
            var clone    = target.CloneDictionary(original);

            Assert.AreNotSame(original, clone);
            Assert.IsInstanceOf <SortedDictionary <string, object> >(clone);
        }
Example #3
0
        private static Func <object, ObjectClonerReferenceTracker, object> GenerateCloner(Type sourceType)
        {
            InternalSerializationStuff.ValidateSupportedTypes(sourceType);

            ParameterExpression sourceParameter = Expression.Parameter(typeof(object), "sourceParam");
            ParameterExpression refTrackerParam = Expression.Parameter(typeof(ObjectClonerReferenceTracker), "refTrackerParam");

            var clone  = Expression.Parameter(sourceType, "newInstance");
            var source = Expression.Parameter(sourceType, "source");

            var variables   = new List <ParameterExpression>();
            var expressions = new List <Expression>();

            variables.Add(source);
            variables.Add(clone);
            expressions.Add(Expression.Assign(source, Expression.Convert(sourceParameter, sourceType)));

            if (sourceType.IsPrimitive || sourceType.IsValueType || (sourceType == typeof(string)))
            {
                expressions.Add(Expression.Assign(clone, source));
            }
            else if (InternalSerializationStuff.ImplementsISerializableWithSerializationConstructor(sourceType))
            {
                expressions.Add(ISerializableCloner.GenerateISerializableExpression(variables, source, clone, sourceType, refTrackerParam));
            }
            else if (InternalSerializationStuff.ImplementsDictionaryGeneric(sourceType))
            {
                expressions.Add(DictionaryCloner.GenerateDictionaryGenericExpression(variables, source, clone, sourceType, refTrackerParam));
            }
            else if (sourceType == typeof(ExpandoObject))
            {
                expressions.Add(ExpandoCloner.GenerateExpandoObjectExpression(variables, source, clone, refTrackerParam));
            }
            else if (sourceType.IsArray)
            {
                expressions.Add(ArrayCloner.GenerateArrayExpression(variables, source, clone, sourceType, refTrackerParam));
            }
            else
            {
                expressions.Add(ClassCloner.GenerateClassExpressions(variables, sourceType, source, clone, refTrackerParam));
            }

            // Value types require manual boxing
            if (sourceType.IsValueType)
            {
                expressions.Add(Expression.Convert(clone, typeof(object)));
            }
            else
            {
                expressions.Add(clone);
            }

            return(Expression.Lambda <Func <object, ObjectClonerReferenceTracker, object> >(Expression.Block(variables, expressions), sourceParameter, refTrackerParam).Compile());
        }
        public void NestedDictionariesShouldBeCloned()
        {
            var target = new DictionaryCloner();
            var nested = new List<Dictionary<string, object>> { new Dictionary<string, object> { { "Answer", 42 } } };
            var original = new Dictionary<string, object> { { "Nested", nested } };

            var clone = target.CloneDictionary(original);

            Assert.IsTrue(clone.ContainsKey("Nested"));
            var nestedClone = clone["Nested"] as List<Dictionary<string, object>>;
            Assert.IsNotNull(nestedClone);
            Assert.AreNotSame(nested, nestedClone);
            Assert.IsTrue(nestedClone.Count == 1);
            Assert.AreEqual(42, nestedClone[0]["Answer"]);
        }
Example #5
0
        public void NestedDictionaryShouldBeCloned()
        {
            var target = new DictionaryCloner();
            var nested = new Dictionary <string, object> {
                { "Answer", 42 }
            };
            var original = new Dictionary <string, object> {
                { "Nested", nested }
            };

            var clone = target.CloneDictionary(original);

            Assert.IsTrue(clone.ContainsKey("Nested"));
            var nestedClone = clone["Nested"] as Dictionary <string, object>;

            Assert.IsNotNull(nestedClone);
            Assert.AreNotSame(nested, nestedClone);
            Assert.IsTrue(nestedClone.ContainsKey("Answer"));
            Assert.AreEqual(42, nestedClone["Answer"]);
        }