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

标签 c# .net visual-studio reflection

我已经达到了我的技能极限。我什至不知道这是否可能 - 但我希望是这样。

我正在制作命令处理程序(文本)。对于每个 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/

相关文章:

c# - 在运行时将游戏对象捕捉到 Unity 3D 中的另一个游戏对象

.net - WPF(或 WinForm)WebView 无法打开本地 URL(NotFound 404 错误)

c# - 使 Entity Framework 只读

c# - C#.NET 中的 SQLite3

c# - 构建期间未知的命名空间(但智能感知知道)

c# - 在调试期间,进入后台工作线程/线程。可能的?

c# 对象初始值设定项的复杂性。最佳实践

c# - 如何将图像从资源复制到磁盘

c# - 如何从 Entity Framework Core 数据库调用中获取 Option<T>?

c - 为 C API 文件管理替换 dir.h