使用反射与参数提高异常在GetParameters执行方法(Use reflection to ex

2019-10-30 11:23发布

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

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

我努力去理解乔恩斯基特提供的堆栈答案 ,但无法得到它的工作。 我想这是因为我误解他的榜样的讨论或使用。

所以我的问题是:如何获得的填充通过在命令提示符下用户输入的值的参数列表? 该方法的一部分作品,我成功地运行没有参数的方法,但是当我添加的代码来处理参数,它被认为是复杂的。

Answer 1:

我认为你正在试图做的就是,你可以使用参数的字典,如果你的初始字符串包含一个逗号分隔的参数列表,你可以通过做这样的事情得到它

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

但这里要注意的字典中的值的类型是“字符串”,因为输入进来的字符串。

这将需要输入如

"GetUser id=1,name=tom,path=C"

并将其转换为与键“ID”,“名称”和“路径”和值“1”,“汤姆”和“C”的字典。 然后,当你做

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

你会得到所需要的值,可以传递给method.Invoke阵列();

另外:如果你原来的参数列表是由空格,则原来的“分割”声明将有分裂这些分隔的,所以现在你commandStructure阵列将包含的方法名称和参数。 这本字典的方法将成为:

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


Answer 2:

你可能希望这样的:

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

在地方例外。 但不知道为什么你需要它。



文章来源: Use reflection to execute a method with parameters raising Exception in GetParameters
标签: c# reflection