コード例 #1
0
        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));
        }