C# 检测通过委托调用的方法是否放弃参数

C# 检测通过委托调用的方法是否放弃参数,c#,parameters,c#-7.0,C#,Parameters,C# 7.0,我正在为我的控制台应用程序制作一个命令系统。有些命令按“原样”使用(如“EXITAP”),有些命令需要参数(如“服务器启动ip端口”)。我是这样做的: delegate void CommandHandlerMethod(params object[] args); readonly Dictionary<string, CommandHandlerMethod> commands; 然后我只是循环浏览字典,我想在两种情况之间做出选择: 1.如果命令处理方法放弃参数,则只需调用它

我正在为我的控制台应用程序制作一个命令系统。有些命令按“原样”使用(如“EXITAP”),有些命令需要参数(如“服务器启动ip端口”)。我是这样做的:

delegate void CommandHandlerMethod(params object[] args);
readonly Dictionary<string, CommandHandlerMethod> commands;
然后我只是循环浏览字典,我想在两种情况之间做出选择:
1.如果命令处理方法放弃参数,则只需调用它
2.否则,从输入字符串中剪切参数并将其作为参数传递

那么,检测参数丢弃的选项是什么

UDP:这是我真正想要的“伪”:

foreach (KeyValuePair<string, CommandHandlerMethod> cmd in commands)
{
    (input.StartsWith(cmd.Key))
    {
        if (cmd.Value. /*is declared to discard arg */)
            cmd.Value();
        else
            // else cut args and pass them
            cmd.Value(input.Substring(cmd.Key.Length+1).Split(' '));
        break;
    }
}
foreach(命令中的KeyValuePair cmd)
{
(输入.StartsWith(命令键))
{
如果(cmd.Value./*被声明为放弃arg*/)
cmd.Value();
其他的
//否则,切下args并传递它们
cmd.Value(input.Substring(cmd.Key.Length+1.Split(“”));
打破
}
}

void ExitAppCommand(params object[].{…}
中的
不是一个命令<代码>.
是有效的C标识符

但是,在以下代码中,
\uu
是放弃:

public void N(int x)
{
    _ = x.ToString();
    _ = 2 + 3;
}

检查它。

void ExitAppCommand(params object[].{…}
中的
{/code>不是一个<代码>.
是有效的C标识符

但是,在以下代码中,
\uu
是放弃:

public void N(int x)
{
    _ = x.ToString();
    _ = 2 + 3;
}

检查它。

为什么不总是“从输入字符串中剪切参数并将其作为参数传递”?如果不需要的话,这项工作将被丢弃。是的,我考虑过,但是如果没有更好的方法,我想使用这个选项。我的意思是,我无论如何都需要将输入字符串长度与命令长度共同比较(因为如果我的子字符串超出预期,将引发异常)。您可以向每个命令处理程序添加类似于
if(args.count!=)throw new Exception(“..
)的内容。我的意思是,如果找到的命令有以下声明:
void命令(params string[])
(即方法是用参数声明的,但不接受它),则不会发生子字符串,并且只有当该方法像往常一样接受参数时,才会将其子字符串并解析为该方法。更新了一个问题,以显示我在伪代码中到底想要什么为什么不总是“从输入字符串中剪切参数并将其作为参数传递?”“?如果不需要,该工作将被丢弃。是的,我考虑过这一点,但如果没有更好的方法,我希望使用此选项。我的意思是,我无论如何都需要将输入字符串长度与命令长度进行共同比较(因为如果子字符串超出预期,将引发异常)。您的问题有点不清楚。您可以向每个命令处理程序添加类似于
if(args.count!=)抛出新异常(“..
)的内容。我的意思是如果找到的命令有以下声明:
void command(params string[])
(即方法用参数声明,但不接受它),则不会发生子字符串,并且只有当方法像往常一样接受参数时,才使用子字符串并将它们解析到此方法。更新了一个问题,以显示我在伪代码中的确切要求。您是对的,这确实是这样工作的。但是,是否可以忽略参数?以节省内存等。如果您不在调用中声明任何参数站点,它将发送
Array.Empty()
。您担心的内存是什么?我的意思是,如果用户输入像“exitapp blablabla bla bla bla bla bla bla bla”这样的命令,处理方法不需要任何参数,但仍将获取它们,因为blabla bla被自动剪切并传递给params对象[]但是正如上面提到的canton7,所有这些的检测都会利用大量的反射,而这些反射也不起作用,所以最好忽略这一点,唯一的解决方法就是用正确的参数声明委托,并对其进行解析,就像ASP.NET MVC/Web API那样。这需要反射您是对的,这确实是这样工作的。但是可以忽略参数吗?保存内存等。如果您不在调用站点声明任何参数,它将发送
Array.Empty()
。您担心什么内存?我的意思是,如果用户输入一个命令,如“exitapp bla bla bla bla bla bla bla bla bla”,处理方法不需要任何参数,但仍将获取这些参数,因为该bla bla将自动剪切并传递给params object[]但是正如上面提到的canton7,所有这些的检测都会利用大量的反射,而这些反射也不起作用,所以最好忽略这一点,唯一的解决方法就是用正确的参数声明委托,并对其进行解析,就像ASP.NET MVC/Web API那样。这需要反射而且,可能还有更多的记忆。