public DataTable MacroHelp(MacroList macros, string[] args) { var dt = new DataTable("MacroHelp"); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Description", typeof(string)); dt.Columns.Add("Help", typeof(string)); foreach (var item in macros) { var dr = dt.NewRow(); dt.Rows.Add(dr); var methodAttr = MacroList.GetAttribute <MacroMethodAttribute>(item); dr["Name"] = methodAttr.Name ?? item.MethodInfo.Name; dr["Description"] = methodAttr.Description; dr["Help"] = MacroList.CreateHelp(item.MethodInfo); } return(dt); }
/// <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); }