好吧,我不确定你打算如何准确地调用它。由于您有可变数量的输入,因此您可以将它们视为数组输入。
delegate double MyDictionaryDelegate(params double[] input);
static Dictionary<string, MyDictionaryDelegate> _functions;
static void AddFunction (MyDictionaryDelegate d)
{
_functions.Add(d.Method.Name, d);
}
但这实际上将您的调用函数转变为处理集合(这意味着任何好处/限制):
public static double MyFunc (params double[] input)
{
return input.Sum();
}
所以你的用法可能是这样的:
_functions = new Dictionary<string, MyDictionaryDelegate> ();
AddFunction(MyFunc);
Console.WriteLine(_functions["MyFunc"](1, 2.5, 0));//3.5
但我怀疑你宁愿保留参数参数的原始列表而不是列表,如下所示:
public static double AnotherFunc(double x, double y, double z)
{
return x + y + z;
}
你可以简单地有一个包装函数:
public static double AnotherFunc(params double[] input)
{
//preferably with some check that the proper number of
//input parameters are included
return AnotherFuncImpl(input[0], input[1], input[2]);
}
但这对我来说似乎总体上有点危险。我不确定我会推荐它。
编辑:这是避免param double[] input
数组并始终具有固定参数参数的另一种选择。像你一样使用Delegate
,但你必须使用它的DynamicInvoke
. 此外,您AddFunction
将为您期望合理拥有的每个参数数量声明几个重载:
static Dictionary<string, Delegate> _functions;
private static void AddFunction (string functionName, Delegate d)
{
_functions.Add(functionName, d);
}
private static void AddFunction(Func<double> d)
{
_functions.Add(d.Method.Name, d);
}
private static void AddFunction(Func<double, double> d)
{
_functions.Add(d.Method.Name, d);
}
private static void AddFunction(Func<double, double, double> d)
{
_functions.Add(d.Method.Name, d);
}
private static void AddFunction(Func<double, double, double, double> d)
{
_functions.Add(d.Method.Name, d);
}
//additional overloads up to N parameters
那么用法可能是:
public static double MyFunc(double x, double y, double z)
{
return x + y + z;
}
_functions = new Dictionary<string, Delegate> ();
AddFunction(MyFunc);
Console.WriteLine(_functions["MyFunc"].DynamicInvoke(1, 2.5, 0));//3.5
但是再一次,如果调用者没有正确调用所需参数DynamicInvoke
的确切数量(不多也不少),这可能会失败。
总体而言,我仍然觉得,无论您在做什么,都会从不同的设计中受益。