public static Tuple <object, object> CopyMemberValue( this MemberExpression memberExpression, object source, object destination) { object copiedValue = default(object); var sourceValue = memberExpression.GetMemberValue(source); if (sourceValue != null) { var type = sourceValue.GetType(); var typeInfo = type.GetTypeInfo(); if (!typeInfo.IsClass || sourceValue is string) { copiedValue = sourceValue; SetValue(memberExpression, destination, copiedValue); } else { var destinationValue = memberExpression.GetMemberValue(destination); if (destinationValue == null) { if (type.IsArray) { var sourceArray = (Array)sourceValue; copiedValue = Activator.CreateInstance(type, new object[] { sourceArray.Length }); } else { var constructor = typeInfo.DeclaredConstructors.First(e => e.GetParameters().Count() == 0); copiedValue = constructor.Invoke(null); } } else { copiedValue = destinationValue; } SetValue(memberExpression, destination, copiedValue); } } return(new Tuple <object, object>(sourceValue, copiedValue)); }