C#如何调用参数数量未知的方法

我在这里达到了我的技能极限。 我甚至不知道这是否可行 – 但我希望是这样。

我正在制作一个命令处理程序(文本)。 对于每个Add()您可以指定所需参数的数量及其类型。 例如:

 void Add(string commandName, int requiredParameters, params Type[] paramTypes) { } Add("test", 2, typeof(string), typeof(int)); 

所以一个示例命令是: /test hello 7 。 命令处理程序检查以确保类型是正确的,例如,如果第二个参数不能转换为int,它将失败。

现在我遇到的问题是我想在Add()传递一个方法。 (如果所有检查都通过,命令处理程序将调用此方法,并使用所需参数调用它)。 因此,所讨论的方法可以根据Add()传递的内容提供任意数量的参数。

我该如何实现这一目标? 代表不工作,抱怨参数不匹配。 我尝试过这样的事情:

 void Add(..., Action method) { } Add(..., new Action(cmd_MyMethod)); 

但我必须为很多类型创建一个Add()方法。 例如, Add ,这也很难输入对Add()的调用。

我不想将该方法作为字符串调用,然后使用this.GetType().GetMethod()来获取它的句柄。 虽然这种方式是理想的,但是当我进行混淆时它会混乱。

有谁知道有任何方法可以做到这一点? 提前致谢。

试试这个:

 void Add(string commandName, int requiredParameters, Delegate method) { } 

您可以调用method.DynamicInvoke(...)来调用委托引用的方法。 请注意,这将使用reflection,因此它不会很快。 但它很灵活。

请注意,您仍然需要使用特定类型构造委托,因此您最终可能会这样调用它:

 Add("test", 2, new Action(cmd_MyMethod)); 

请注意,我省略了Type[]参数,因为您实际上可以从委托引用的MethodInfo提取它!
method.Method.GetParameters().Select(p => p.ParameterType).ToArray()

Action与您的Add方法匹配。

例:

 public class ParamsTest { public void CallMyMethod() { Action myDelegate = new Action(MyMethod); myDelegate("hello", new int[] { 1, 2, 3, 4 }); } private void MyMethod(string arg1, params int[] theRest) { Console.WriteLine(arg1); foreach (int i in theRest) { Console.WriteLine(i); } Console.WriteLine("end"); } } 

您可以创建自己的自定义属性,可用于标记,然后识别(现在混淆)方法,并使用reflection根据属性查找它们。 然后,您可以使用MethodInfo中的Invoke()来实际调用该方法。