如果你真的需要这种功能,你可以做这样的事情。
public delegate object GenericCommand (params object[] parameters);
然后,您需要为要存储的每个符合 GenericCommand 定义的方法提供重载。
这是一个看起来像的例子。
using System;
using System.Collections.Generic;
public class Program
{
public delegate object GenericCommand (params object[] parameters);
public static object Function1 (params object[] parameters) => Function1 ((int)parameters[0], (int)parameters[1]);
public static int Function1 (int i, int j) => (i + j);
private static Dictionary<string, GenericCommand> commands;
public static void Main()
{
commands = new Dictionary<string, GenericCommand> ();
commands.Add ("Function1", Function1);
int i = (int)commands["Function1"](1, 2);
Console.WriteLine (i); // 3
}
}
话虽如此,在像 C# 这样的语言中这样做有点棘手是有原因的。在强类型语言中,期望在调用方法时,用户心中有一组特定的输入,并期望得到特定类型的输出。通常很少需要一些不起眼的东西,GenericCommand因为如果您知道方法的名称以及它通常在哪里,为什么不直接调用它呢?
如果您发现自己在程序中非常需要这种功能,那么我会考虑用另一种语言编写基线的那部分。我对它的了解有限,但我相信F#可以轻松完成您的要求。Javascript 是另一种选择,但 F# 是作为 C# 的姊妹函数式语言编写的,因此它可能更容易集成到您的项目中。函数式语言(据我所知)更关心您正在编写的内容的纯功能,而不是操作数的性质,尽管我不太确定它是否与参数的数量一样不可知。这当然值得调查。