private static string ArgumentToString(ArgumentPropertyAttribute attribute, PropertyInfo property, object value)
        {
            bool isRequired = attribute.PropertyType == ArgumentPropertyType.Required;
            bool isSwitch   = attribute.PropertyType == ArgumentPropertyType.Switch;

            if (value == null)
            {
                if (isRequired)
                {
                    throw new TaupoArgumentException(string.Format(CultureInfo.CurrentCulture, "Missing value for required argument {0}.", property.Name));
                }

                return(null);
            }

            if (property.PropertyType.GetBaseType() == typeof(Enum))
            {
                if (!isRequired && (int)value == 0)
                {
                    return(null);
                }
            }

            if (value is bool)
            {
                if (isSwitch && (bool)value == false)
                {
                    return(null);
                }
            }

            StringBuilder sb = new StringBuilder();

            var collectionValue = value as ICollection;

            if (collectionValue != null)
            {
                var  enumerator = collectionValue.GetEnumerator();
                bool first      = true;
                while (enumerator.MoveNext())
                {
                    if (first)
                    {
                        first = false;
                    }
                    else
                    {
                        sb.Append(' ');
                    }

                    sb.Append(ArgumentToString(attribute, property, enumerator.Current));
                }

                return(sb.ToString());
            }

            sb.Append(attribute.ArgumentName);

            if (!isSwitch)
            {
                sb.Append(QuoteString(value.ToString()));
            }

            return(sb.ToString());
        }
        private static string ArgumentToString(ArgumentPropertyAttribute attribute, PropertyInfo property, object value)
        {
            bool isRequired = attribute.PropertyType == ArgumentPropertyType.Required;
            bool isSwitch = attribute.PropertyType == ArgumentPropertyType.Switch;

            if (value == null)
            {
                if (isRequired)
                {
                    throw new TaupoArgumentException(string.Format(CultureInfo.CurrentCulture, "Missing value for required argument {0}.", property.Name));
                }

                return null;
            }

            if (property.PropertyType.GetBaseType() == typeof(Enum))
            {
                if (!isRequired && (int)value == 0)
                {
                    return null;
                }
            }

            if (value is bool)
            {
                if (isSwitch && (bool)value == false)
                {
                    return null;
                }
            }

            StringBuilder sb = new StringBuilder();

            var collectionValue = value as ICollection;
            if (collectionValue != null)
            {
                var enumerator = collectionValue.GetEnumerator();
                bool first = true;
                while (enumerator.MoveNext())
                {
                    if (first)
                    {
                        first = false;
                    }
                    else
                    {
                        sb.Append(' ');
                    }

                    sb.Append(ArgumentToString(attribute, property, enumerator.Current));
                }

                return sb.ToString();
            }

            sb.Append(attribute.ArgumentName);

            if (!isSwitch)
            {
                sb.Append(QuoteString(value.ToString()));
            }

            return sb.ToString();
        }