【问题标题】:CommandLine parser for arrays of type enum枚举类型数组的命令行解析器
【发布时间】:2012-06-26 22:07:48
【问题描述】:

我们正在尝试找到一个可以用枚举解析数组的命令行解析器。 CommandlineParser 支持使用 int 或 string 解析数组,但不支持 enum。 例如

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

工作正常。但不是下面那个:

 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; }

【问题讨论】:

  • 你不问问题,只是陈述你的意图。您是否在问如何将该功能添加到 CommandLineParser ?或者是否有其他内置的库?或者如何构建自己的 CommandLineParser ?
  • 谢谢马特。我正在尝试使用现有的命令行解析器,因为它应该很容易获得。 CommandLineParser 确实支持枚举,但我没有看到任何使用枚举数组的示例。

标签: c# command-line command-line-arguments


【解决方案1】:

不确定这是否是您正在寻找的,如果是的话,它应该能让您走上正轨。

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();
    }
}

【讨论】:

  • 实际上,看了上面的 cmets 之后,我肯定会看其中一个库。
  • 看起来现有的解析器不支持枚举集合。作为一种解决方法,我在我的代码中使用字符串数组并将它们转换为枚举。
【解决方案2】:

这是一个用于解析枚举数组的命令行补丁。我创建了一个拉取请求。 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;
    }

【讨论】:

    猜你喜欢
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    相关资源
    最近更新 更多