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

Lyn*_*nxy 6 .net c# reflection visual-studio

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

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

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

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

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

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

void Add<T1, T2>(..., Action<T1, T2> method) { }
Add(..., new Action<string, int>(cmd_MyMethod));
Run Code Online (Sandbox Code Playgroud)

但我必须为很多类型创建一个Add()方法.例如Add<T1, T2, T3, T4, etc>,它也使得输入调用变得很麻烦Add().

希望作为一个字符串传递给调用的方法,然后用this.GetType().GetMethod()得到它的句柄.虽然这种方式是理想的,但是当我进行模糊处理时它会变得混乱.

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

cdh*_*wie 3

尝试这个:

void Add(string commandName, int requiredParameters, Delegate method) { }
Run Code Online (Sandbox Code Playgroud)

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

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

Add("test", 2, new Action<string, int>(cmd_MyMethod));
Run Code Online (Sandbox Code Playgroud)

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