2012-06-25 1 views
2

Nous essayons de trouver un analyseur de ligne de commande qui peut analyser un tableau avec enums. CommandlineParser prend en charge l'analyse des tableaux avec un int ou une chaîne mais pas enum. Pour par exemple Analyseur CommandLine pour les tableaux de type enum

[OptionArray("o", "output", HelpText = "The output files to generate.", DefaultValue = new[] { "OptimizeFor.Accuracy", "OptimizeFor.Speed" })] 
    public string[] OutputFiles { get; set; } 

fonctionne très bien. Mais pas celui ci-dessous:

public enum OptimizeFor 
     { 
      Unspecified, 
      Speed, 
      Accuracy 
     } 
    [OptionArray("o", "output", HelpText = "The output files to generate.", DefaultValue = new[] { OptimizeFor.Accuracy, OptimizeFor.Speed })] 
    public OptimizeFor[] OutputFiles { get; set; } 
+1

Vous ne posez pas de question, simplement en indiquant votre intention. Demandez-vous comment ajouter cette fonctionnalité à CommandLineParser? Ou s'il y a d'autres bibliothèques ayant cela intégré? Ou comment créer un CommandLineParser de votre choix? – driis

+0

La bibliothèque de Peter Hallam (http://commandlinearguments.codeplex.com/SourceControl/changeset/view/7986#178393) supporte les enums – dash

+0

Merci Matt. J'essaye d'employer l'analyseur de ligne de commande existant comme pensé qu'il devrait être facilement disponible. CommandLineParser prend en charge les énumérations mais je n'ai vu aucun exemple où des tableaux d'énumération ayant des enum ont été utilisés. – sunny

Répondre

-1

Vous ne savez pas si ce que vous cherchez, si c'est le cas, il devrait vous mettre sur la bonne voie.

public enum OptimizeFor 
{ 
    Unspecified, 
    Speed, 
    Accuracy 
} 

public class EnumParser 
{ 
    public static IEnumerable<TEnum> FindSelected<TEnum>(IEnumerable<string> enumItemNames) 
    { 
     var selectedOtions = Enum.GetNames(typeof(TEnum)) 
      .Intersect(enumItemNames, StringComparer.InvariantCultureIgnoreCase) 
      .Select(i => Enum.Parse(typeof(TEnum), i)) 
      .Cast<TEnum>(); 
     return selectedOtions; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     //Some fake arguments 
     args = new[] {"-o", "SPEED", "accuracy", "SomethingElse"}; 

     var selectedEnumVals = EnumParser.FindSelected<OptimizeFor>(args); 

     selectedEnumVals.Select(i => i.ToString()).ToList().ForEach(Console.WriteLine); 
     Console.Read(); 
    } 
} 
+0

En fait, après avoir regardé les commentaires ci-dessus, je regarderais certainement une de ces bibliothèques. – amsprich

+0

On dirait que les analyseurs existants ne supportent pas la collection enum. Pour contourner le problème, j'utilise le tableau de chaînes et je les convertis en énumération dans mon code. – sunny

1

Voici un correctif à ligne de commande pour analyser les matrices enum. J'ai créé une demande de traction. https://github.com/gsscoder/commandline/pull/148

public bool SetValue(IList<string> values, object options) 
    { 
     var elementType = _property.PropertyType.GetElementType(); 

     var propertyType = elementType; 
     if (propertyType.IsGenericType && 
     propertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) 
     { 
      propertyType = propertyType.GetGenericArguments()[0]; 
     } 

     var array = Array.CreateInstance(elementType, values.Count); 

     for (var i = 0; i < array.Length; i++) 
     { 
      try 
      { 
       if (propertyType.BaseType.Equals(typeof (System.Enum))) 
       { 
        array.SetValue(Enum.Parse(propertyType, values[i]), i); 
        _property.SetValue(options, array, null); 
       } 
       else 
       { 
        array.SetValue(Convert.ChangeType(values[i], elementType, _parsingCulture), i); 
        _property.SetValue(options, array, null); 
       } 
      } 
      catch (FormatException) 
      { 
       return false; 
      } 
     } 

     return ReceivedValue = true; 
    }