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()
来实际调用该方法。