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); }
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); }
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"]); }
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"]); }