private static Object GetMemberValue(CommandLineParameterAttribute commandLineSwitchAttribute, Type valueType, TraceSource traceSource)
        {
            valueType.ThrowIfNull();

            foreach (var switchName in commandLineSwitchAttribute.Names
                     .Where(item => !item.IsNullOrWhiteSpace())
                     .Select(item => item.Trim())
                     .Select(item => item.First() != ParameterCharacter
          ? ParameterCharacter + item
          : item))
            {
                var index = CommandLine.IndexOf(switchName, !commandLineSwitchAttribute.IsCaseSensative
          ? StringComparison.CurrentCultureIgnoreCase
          : StringComparison.CurrentCulture);

                if (index > -1)
                {
                    index += switchName.Length;

                    var nextIndex = CommandLine.IndexOf(ParameterCharacter, index);

                    if (nextIndex == -1)
                    {
                        nextIndex = CommandLine.Length;
                    }

                    var domain = CommandLine.Substring(index, nextIndex - index).Trim();

                    var values = MemberValueRegex
                                 .Matches(domain)
                                 .Cast <Match>()
                                 .Where(match => match.Success)
                                 .Select(match => match.Value)
                                 .Select(value => value.Trim('\"', ' '))
                                 .ToArray();

                    // Check if the member accepts multiple arguments separated by spaces.
                    if (typeof(IEnumerable).IsAssignableFrom(valueType))
                    {
                        var enumerableTypes = valueType.IsArray
              ? new[] { valueType.GetElementType() }
              : valueType.GetGenericArguments();

                        switch (enumerableTypes.Length)
                        {
                        case 0:
                            return(values);

                        case 1:
                            var enumerableType = enumerableTypes.Single();

                            if (enumerableType.IsAssignableFrom(typeof(String)))
                            {
                                return(values);
                            }
                            else
                            {
                                var typeConverter = TypeDescriptor.GetConverter(enumerableType);

                                if (typeConverter.CanConvertFrom(typeof(String)))
                                {
                                    var result = Array.CreateInstance(enumerableType, values.Length);

                                    for (int valueIndex = 0; valueIndex < values.Length; valueIndex++)
                                    {
                                        result.SetValue(typeConverter.ConvertFromString(values[valueIndex]), valueIndex);
                                    }

                                    return(result);
                                }
                                else
                                {
                                    traceSource.TraceError("Cannot convert '{0}' to '{1}'"
                                                           , typeof(String).FullName
                                                           , valueType.GetElementType().FullName);
                                }
                            }
                            break;

                        default:
                            traceSource.TraceError("Cannot handle more than 1 generic argument ('{0}')", valueType.FullName);
                            break;
                        }
                    }
                    else if (typeof(Boolean) == valueType && !values.Any())
                    {
                        return(true);
                    }
                    else if (values.Any())
                    {
                        var value         = values.First();
                        var typeConverter = TypeDescriptor.GetConverter(valueType);

                        if (typeConverter.CanConvertFrom(typeof(String)))
                        {
                            return(typeConverter.ConvertFromString(value));
                        }
                        else
                        {
                            traceSource.TraceError("Cannot convert '{0}' to '{1}'", typeof(String).FullName, valueType.FullName);
                        }
                    }
                    else
                    {
                        traceSource.TraceError("Unable to extract any value of type '{0}' from '{1}'", valueType.FullName, domain);
                    }
                }
            }

            return(GetDefaultValue(valueType));
        }
 private static void Bind(CommandLineParameterAttribute commandLineSwitchAttribute, Object instance, FieldInfo fieldInfo, TraceSource traceSource)
 {
     fieldInfo.SetValue(instance, GetMemberValue(commandLineSwitchAttribute, fieldInfo.FieldType, traceSource));
 }
 private static void Bind(CommandLineParameterAttribute commandLineSwitchAttribute, Object instance, PropertyInfo propertyInfo, TraceSource traceSource)
 {
     propertyInfo.SetValue(instance, GetMemberValue(commandLineSwitchAttribute, propertyInfo.PropertyType, traceSource), null);
 }