internal Func <double[], double> ToFunctionStrategy() { var types = typeof(FunctionStrategies) .GetFields(BindingFlags.Static | BindingFlags.Public); var functions = new List <Func <double[], double> >(); foreach (var functionName in FunctionNames) { foreach (var type in types) { if (type.Name.Equals(functionName, StringComparison.OrdinalIgnoreCase)) { functions.Add((Func <double[], double>)type.GetValue(null)); break; } } } if (functions.Count != FunctionNames.Count()) { throw new ArgumentException(nameof(FunctionNames)); } if (functions.Count == 1) { return(functions.Single()); } return(GetMultifunctionStrategy(functions.ToArray())); }