// Replaced with a DLR based binder - but code is preserved in case that approach doesn't
        // work well performance wise.

        // See if it's a value type being assigned and
        // make a copy if it is...
        private static object PreserveValueType(object value)
        {
            if (value == null)
            {
                return(null);
            }

            // Primitive types are immutable so just return them...
            Type valueType = value.GetType();

            if (valueType.IsPrimitive)
            {
                return(value);
            }

            PSObject valueAsPSObject = value as PSObject;

            if (valueAsPSObject != null)
            {
                object baseObject = valueAsPSObject.BaseObject;
                if (baseObject != null)
                {
                    valueType = baseObject.GetType();
                    if (valueType.IsValueType && !valueType.IsPrimitive)
                    {
                        return(valueAsPSObject.Copy());
                    }
                }
            }
            else if (valueType.IsValueType)
            {
                return(PSObject.CopyValueType(value));
            }

            return(value);
        }