使用反射来执行带有在GetParameters中引发Exception的参数的方法



我有一个控制台应用程序,我正在测试输入命令的基本能力,如:编辑

AddUser id=1 name=John surname=Doe

编辑假设的方法AddUser可能如下所示:

public AddUser(int id, string name, string surname
{
    //add code here to add user
}

下面是我的代码:

protected void Process(string command)
{
    //get the type
    Type type = this.GetType(); 
    //do a split on the command entered
    var commandStructure = command.Split(' ');
    try
    {
        //reassign the command as only the method name
        command = commandStructure[0];
        //remove the command from the structure
        commandStructure = commandStructure.Where(s => s != command).ToArray();
        //get the method
        MethodInfo method = type.GetMethod(command, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
        //if the method was found
        if (method != null)
        {
            Dictionary<string, ParameterInfo> dictionary = new Dictionary<string, ParameterInfo>();
            //**Here's where I get the exception that the key was not found in the** 
            //**dictionary**
            var parameters = method.GetParameters()
                .Select(p => dictionary[p.Name])
                .ToArray();
            //add code here to apply values found in the command to parameters found
            //in the command
            //...
            method.Invoke(this, parameters);
        }
        else
        {
            throw new Exception("No such command exists man! Try again.");
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
        Prompt();
        Wait();
    }
}

我试图理解由Jon Skeet提供的堆栈答案,但无法使其工作。我想这是因为我误解了他的例子的讨论或使用。

所以我的问题是:我如何获得一个由用户在命令提示符中输入的值填充的参数列表?方法部分可以工作,我成功地运行了没有参数的方法,但是当我添加处理参数的代码时,它变得复杂了。

我认为你要做的是得到一个参数字典如果你的初始字符串包含逗号分隔的参数列表你可以这样做

Dictionary<string, string> dictionary = commandStructure[1].Split(',')
.ToDictionary(x => x.Split('=').First(), x => x.Split('=').Last());

但是注意这里字典的值是"string"类型的,因为输入是字符串。

这将接受像

这样的输入
"GetUser id=1,name=tom,path=C"

并将其转换为键为"id"、"name"one_answers"path"的字典,值为"1"、"tom"one_answers"C"。然后当你做

var parameters = method.GetParameters()
            .Select(p => dictionary[p.Name])
            .ToArray();

您将获得所需值的数组,该数组可以传递给method.Invoke();

或者:如果您的原始参数列表是由空格分隔的,那么您的原始"Split"语句将拆分这些,所以现在您的commandStructure数组将包含方法名称和参数。dictionary方法将变成:

Dictionary<string, string> dictionary = commandStructure.Skip(1)
.ToDictionary(x => x.Split('=').First(), x => x.Split('=').Last());

你可能想要这样:

dictionary = method.GetParameters()
                   .ToDictionary(x => x.Name, x => x);

代替异常。但不确定你为什么需要它

相关内容

  • 没有找到相关文章

最新更新