/// <summary> /// Execute macro statement /// </summary> /// <param name="query"></param> /// <returns></returns> public DataSet Execute(string query) { query = RegexUtil.Sub(query, "^[ \t]*@[ \t]*", ""); var tokens = query.Split(new char[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); #region Invoke Macro if (macros == null) { macros = new MacroList(); macros.AddInstance(macroLib); } var mx = macros.Find(p => { var m = MacroList.GetAttribute <MacroMethodAttribute>(p).Name ?? p.MethodInfo.Name; return(m.Equals(tokens[0], StringComparison.InvariantCultureIgnoreCase)); }); if (mx == null) { throw new ArgumentException("macro not found: " + tokens[0]); } object result = null; try { if (mx.MethodInfo.Name.Equals("MacroHelp", StringComparison.InvariantCultureIgnoreCase)) { result = DynamicCode.InvokeMethod(mx.Instance, "MacroHelp", macros, tokens); } else { var parameters = MacroList.CreateParameter(mx.MethodInfo, tokens); result = DynamicCode.InvokeMethod(mx.Instance, mx.MethodInfo.Name, parameters); } } catch (Exception ex) { throw new ArgumentException(ex.Message + Environment.NewLine + MacroList.CreateHelp(mx.MethodInfo), ex); } #endregion #region Return DataSet var ds = new DataSet("MacroResults"); if (result is DataTable) { ds.Tables.Add(result as DataTable); } else { var dt = new DataTable(); dt.Columns.Add("Value", mx.MethodInfo.ReturnType); dt.Rows.Add(result); ds.Tables.Add(dt); } #endregion return(ds); }