将字符串解析为有效数组

时间:2016-08-01 12:23:10

标签: c#

我需要将命令行参数解析为由方法签名定义的特定数据类型。因此,作为我Main方法中的输入参数,我有一些可能的情况如下:

[11, 23, 32]
[1,24.254,3]
[ 124 ,2, 3.0125 ]
[1, 25, 03.1], 1 , "a", 42, "aac", ["aaa", "bbb", "ccc"]

具有所述案例的所有可能组合。当然,可能存在错误,如不平衡的括号,额外的,.。所以,我可以成功验证不平衡的括号,但不知道如何解析和验证其他东西。同样,我现在所有元素必须,分隔并且知道每个元素的必要数据类型(如果我的方法是public void MyMethod(string[], int a, string b, double c)我可以相应地解析它。)

是否有人知道如何实现这一目标,已经编写了解决方案或其他任何内容?

1 个答案:

答案 0 :(得分:0)

string[] input = //CLI arguments separated by ,

// "YourType" is the type that holds your method
MethodInfo targetMethod = typeof(YourType).GetMethod("MyMethod");

// YourMethod's parameters
ParameterInfo[] parameters = targetMethod.GetParameters();

// This will contain the converted values
object[] arguments = new object[input.Length];

for(int i = 0; i < input.Length; i++)
{
    Type paramType = parameters[i].ParameterType;
    if (paramType.IsArray)
    {
        string[] arrayValues = input[i]
                               .Replace("[", String.Empty)
                               .Replace("]", String.Empty)
                               .Split(',');
        arguments[i] = arrayValues
                    .Select(v => Convert.ChangeType(v, paramType.GetElementType())
                    .ToArray();
    }
    else
        arguments[i] = Convert.ChangeType(input[i], paramType);
}

然后,您将使用转换后的值调用该方法。

如果MyMethod是静态的:

targetMethod.Invoke(null, arguments);

如果MyMethod是实例方法

YourType instance = // Instantiate a new object
targetMethod.Invoke(instance, arguments);