public static object Evaluate(string expression, _7Sharp.AdditionalFunctionEventHandler handler) { ExpressionEval expressionEval = new ExpressionEval(expression); expressionEval.AdditionalFunctionEventHandler += handler; return(expressionEval.Evaluate()); }
private object ExecuteFunction(string name, object[] p) { object[] parameters = (object[])null; if (p != null) { parameters = (object[])p.Clone(); for (int index = 0; index < parameters.Length; ++index) { if (parameters[index] is IExpression) { parameters[index] = ((IExpression)parameters[index]).Evaluate(); } } } switch (name.ToLower(CultureInfo.CurrentCulture)) { case "abs": return((object)Math.Abs(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture))); case "acos": return((object)Math.Acos(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture))); case "adddays": return((object)Convert.ToDateTime(parameters[0]).AddDays((double)Convert.ToInt32(parameters[1]))); case "addhours": return((object)Convert.ToDateTime(parameters[0]).AddHours((double)Convert.ToInt32(parameters[1]))); case "addminutes": return((object)Convert.ToDateTime(parameters[0]).AddMinutes((double)Convert.ToInt32(parameters[1]))); case "addmonths": return((object)Convert.ToDateTime(parameters[0]).AddMonths(Convert.ToInt32(parameters[1]))); case "addseconds": return((object)Convert.ToDateTime(parameters[0]).AddSeconds((double)Convert.ToInt32(parameters[1]))); case "addyears": return((object)Convert.ToDateTime(parameters[0]).AddYears(Convert.ToInt32(parameters[1]))); case "asin": return((object)Math.Asin(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture))); case "atan": return((object)Math.Atan(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture))); case "case": return(FunctionEval.Case(parameters)); case "cdatetime": return((object)Convert.ToDateTime(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)); case "cdbl": return((object)Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)); case "ciel": return((object)Math.Ceiling(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture))); case "cint": return((object)Convert.ToInt32(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)); case "clong": return((object)Convert.ToInt64(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)); case "cos": return((object)Math.Cos(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture))); case "cosh": return((object)Math.Cosh(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture))); case "cot": return((object)(1.0 / Math.Tan(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)))); case "csc": return((object)(1.0 / Math.Sin(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)))); case "cuint": return((object)Convert.ToUInt32(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)); case "culong": return((object)Convert.ToUInt64(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)); case "currentuserid": return((object)WindowsIdentity.GetCurrent().Name.ToLower()); case "e": return((object)Math.E); case "exp": return((object)Math.Exp(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture))); case "expr": ExpressionEval expressionEval = new ExpressionEval(string.Concat(parameters[0])); // ISSUE: reference to a compiler-generated field expressionEval.AdditionalFunctionEventHandler += this.AdditionalFunctionEventHandler; expressionEval._variables = this._variables; return(expressionEval.Evaluate()); case "floor": return((object)Math.Floor(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture))); case "fmtdate": return((object)Convert.ToDateTime(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture).ToString(string.Concat(parameters[1]), (IFormatProvider)CultureInfo.CurrentCulture)); case "fmtnum": return((object)Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture).ToString(string.Concat(parameters[1]), (IFormatProvider)CultureInfo.CurrentCulture)); case "iif": return(FunctionEval.Iif(parameters)); case "log": return((object)(parameters.Length > 1 ? Math.Log(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture), Convert.ToDouble(parameters[1], (IFormatProvider)CultureInfo.CurrentCulture)) : Math.Log(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)))); case "log10": return((object)Math.Log10(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture))); case "max": return((object)Math.Max(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture), Convert.ToDouble(parameters[1], (IFormatProvider)CultureInfo.CurrentCulture))); case "maxdate": return((object)DateTime.MaxValue); case "min": return((object)Math.Min(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture), Convert.ToDouble(parameters[1], (IFormatProvider)CultureInfo.CurrentCulture))); case "mindate": return((object)DateTime.MinValue); case "monthname": return((object)new DateTime(2000, Convert.ToInt32(parameters[0]), 1).ToString("MMMM")); case "now": return((object)DateTime.Now); case "pi": return((object)Math.PI); case "pow": return((object)Math.Pow(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture), Convert.ToDouble(parameters[1], (IFormatProvider)CultureInfo.CurrentCulture))); case "round": return((object)(parameters.Length > 1 ? Math.Round(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture), Convert.ToInt32(parameters[1], (IFormatProvider)CultureInfo.CurrentCulture)) : Math.Round(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)))); case "sec": return((object)(1.0 / Math.Cos(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture)))); case "sin": return((object)Math.Sin(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture))); case "sinh": return((object)Math.Sinh(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture))); case "sqrt": return((object)Math.Sqrt(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture))); case "str": return((object)parameters[0].ToString()); case "tan": return((object)Math.Tan(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture))); case "tanh": return((object)Math.Tanh(Convert.ToDouble(parameters[0], (IFormatProvider)CultureInfo.CurrentCulture))); case "today": return((object)DateTime.Today); default: return(this.AdditionalFunctionHelper(name, parameters)); } }