Exemple #1
0
        private static void CopyFieldsAndValues(Type genericDictionaryType,
                                                ParameterExpression source,
                                                ParameterExpression clone,
                                                Type sourceType,
                                                ParameterExpression refTrackerParam,
                                                List <Expression> expressions,
                                                List <ParameterExpression> variables)
        {
            var clonedItem = Expression.Parameter(typeof(object), "clonedItem");

            variables.Add(clonedItem);

            var fields = InternalSerializationStuff.GetFields(sourceType,
                                                              genericDictionaryType);

            ClassCloner.GenerateCopyFieldsExpressions(fields,
                                                      source,
                                                      clone,
                                                      expressions,
                                                      refTrackerParam,
                                                      clonedItem);

            var typeKey   = genericDictionaryType.GenericTypeArguments[0];
            var typeValue = genericDictionaryType.GenericTypeArguments[1];

            if (IsPrimitive(typeKey) &&
                IsPrimitive(typeValue))
            {
                expressions.Add(Expression.Call(typeof(DictionaryCloner),
                                                nameof(DictionaryCloner.CopyPrimitiveKeyAndPrimitiveValue),
                                                genericDictionaryType.GenericTypeArguments,
                                                source,
                                                clone));
            }
            else if (!IsPrimitive(typeKey) &&
                     IsPrimitive(typeValue))
            {
                expressions.Add(Expression.Call(typeof(DictionaryCloner),
                                                nameof(DictionaryCloner.CopyObjectKeyAndPrimitiveValue),
                                                genericDictionaryType.GenericTypeArguments,
                                                source,
                                                clone,
                                                refTrackerParam));
            }
            else if (IsPrimitive(typeKey) &&
                     !IsPrimitive(typeValue))
            {
                expressions.Add(Expression.Call(typeof(DictionaryCloner),
                                                nameof(DictionaryCloner.CopyPrivitiveKeyAndObjectValue),
                                                genericDictionaryType.GenericTypeArguments,
                                                source,
                                                clone,
                                                refTrackerParam));
            }
            else
            {
                expressions.Add(Expression.Call(typeof(DictionaryCloner),
                                                nameof(DictionaryCloner.CopyObjectKeyAndObjectValue),
                                                genericDictionaryType.GenericTypeArguments,
                                                source,
                                                clone,
                                                refTrackerParam));
            }
        }