Ну, я не уверен, как вы планируете точно называть это. Так как у вас есть переменная количество входов, вы можете рассматривать их как вход массива.
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]);
}
Но это, кажется, общий вид опасен для меня; Я не уверен, что рекомендую.
EDIT: Вот еще один вариант, чтобы избежать массивов 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
с точным номером необходимых параметров (не более, не менее).
Я по-прежнему чувствую себя как будто в целом, независимо от того, что вы делаете, это принесет пользу из другого дизайна.
На самом деле проблема заключается в следующем: мне нужно написать консольный калькулятор. Одна из перегрузок метода AddFunction выглядит так: – Dima
@ Dima: Я предполагаю, что к вашему комментарию придет больше? :) –
Спасибо за первый ответ. Затем я хотел бы ответить на следующее: давайте представим ситуацию, когда функция принимает параметр double [], но пользователь не должен создавать какие-либо массивы. Вместо этого мы будем иметь в консоли: «MyFunk (10,20,30,40 и т. Д.) =« В моем словаре у меня есть делегат с методом 1-param (массив), но мне нужно знать, сколько параметров используемый в консоли для создания соответствующего массива и передачи его делегату в словаре. Мне действительно нужно получить эту информацию от разбора строки, или есть более умный способ сделать это? – Dima