ええと、これを正確にどのように呼び出すつもりなのかわかりません。可変数の入力があるため、それらを配列入力のように扱うことができます。
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
の正確な数(それ以上でもそれ以下でもありません) で適切に呼び出さなかった場合、これは失敗する可能性があります。
全体として、あなたがしていることは何でも、別のデザインの恩恵を受けるように感じます.