我已经达到了我的技能极限。我什至不知道这是否可能 - 但我希望是这样。
我正在制作命令处理程序(文本)。对于每个 Add()
您指定所需参数的数量及其类型。例如:
void Add(string commandName, int requiredParameters, params Type[] paramTypes) { }
Add("test", 2, typeof(string), typeof(int));
因此,示例命令为:/test hello 7
.命令处理程序检查以确保类型正确,例如,如果第二个参数不能转换为 int,它将失败。
现在我遇到的问题是我想在 Add()
中传递一个方法. (如果所有检查都通过,命令处理程序将调用此方法,并使用所需参数调用它)。因此,根据 Add()
中传递的内容,所讨论的方法可以具有任意数量的参数。 .
我如何实现这一目标?委托(delegate)不工作,提示参数不匹配。我试过做类似的事情:
void Add<T1, T2>(..., Action<T1, T2> method) { }
Add(..., new Action<string, int>(cmd_MyMethod));
但是我必须为很多类型创建一个 Add() 方法。例如 Add<T1, T2, T3, T4, etc>
, 并且它也使输入对 Add()
的调用变得很痛苦。 .
我不想将调用方法作为字符串传递,然后使用this.GetType().GetMethod()
得到它的句柄。虽然这种方式是理想的,但当我进行混淆时它会搞砸。
有没有人知道有什么方法可以做到这一点? 提前致谢。
最佳答案
试试这个:
void Add(string commandName, int requiredParameters, Delegate method) { }
您可以调用method.DynamicInvoke(...)
来调用委托(delegate)引用的方法。请注意,这将使用反射,因此速度不会很快。但它非常灵活。
请注意,您仍然必须使用特定类型构造委托(delegate),因此您最终可能会这样调用它:
Add("test", 2, new Action<string, int>(cmd_MyMethod));
请注意,我省略了 Type[]
参数,因为您实际上可以从委托(delegate)引用的 MethodInfo
中提取它!
(method.Method.GetParameters().Select(p => p.ParameterType).ToArray()
)
关于C#如何调用参数数量未知的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4219696/