/// <summary> /// 添加变量 /// </summary> /// <param name="key"></param> /// <param name="value"></param> public TemplatePage AddVariable <T>(string key, T value) { _dc.DefineVariable(key, value); return(this); }
/// <summary> /// 执行方法并将返回值赋予变量 /// </summary> /// <param name="data"></param> /// <param name="dc"></param> /// <param name="content"></param> /// <returns></returns> private static string EvalMethodToVar(IDataContainer dc, string content, object data) { //正则模式,支持以下 // //$menu="123456\" f" sdf // $menu=12 fsdf // $menu=item:123456 // $menu=>getmenu(test,item,get) const string expressionPattern = "(/*/*)\\$([a-zA-Z][a-zA-Z0-9_]*)\\s*=>\\s*([a-zA-Z][a-zA-Z0-9_]*)\\((([^\\)]|\\\\\\))*)\\)(\\s+\\B)*"; //设置表达式 string varName, methodName, paramArray; Type type = data.GetType(); MethodInfo method; Type[] parameterTypes; object[] parameters; int parametersNum; var outHtml = Regex.Replace(content, expressionPattern, m => { //注释 if (m.Groups[1].Value != "") { return(String.Empty); } //获取变量及表达式 varName = m.Groups[2].Value; methodName = m.Groups[3].Value; paramArray = m.Groups[4].Value.Replace("\\,", "__CSP__"); parameters = paramArray.Trim().Length == 0 ? new object[0] : paramArray.Split(','); parametersNum = parameters.Length; //查找是否存在方法(方法参数均为string类型) parameterTypes = new Type[parametersNum]; for (int i = 0; i < parametersNum; i++) { parameterTypes[i] = typeof(String); parameters[i] = Regex.Replace(parameters[i].ToString(), "\\B\"|\"\\B", String.Empty).Replace("__CSP__", ","); } string key = type.FullName + ":" + methodName + "$" + parameters.Length; if (EvalMethodMap.ContainsKey(key)) { method = EvalMethodMap[key]; } else { var flag = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.IgnoreCase; method = type.GetMethod(methodName, flag, null, parameterTypes, null); EvalMethodMap[key] = method; } if (method != null) { Type returnType = method.ReturnType; if (returnType != typeof(void)) { object result = method.Invoke(data, parameters); if (result != null) { if (returnType.IsPrimitive || returnType == typeof(String)) { dc.DefineVariable(varName, (result ?? "").ToString()); } else { dc.DefineVariable(varName, new Variable { Key = varName, Value = result, Type = returnType }); } } } } /* * else * { * //throw new MissingMethodException("在对象中找不到"); * * Config.DC.DefineVar(varName, "<span style=\"color:red\">在对象中找不到方法<b>"+methodName+"</b>"+ * (parametersNum==0?"":",参数"+parametersNum.ToString()+"个") +"。</span>"); * } */ return(String.Empty); }, RegexOptions.Singleline); return(outHtml); }
/// <summary> /// 赋值到变量 /// $v = form('key') /// </summary> private static string SetToVariable(IDataContainer dc, string content) { //正则模式,支持以下 // //$menu="123456\" f" sdf // $menu=12 fsdf // $menu=item:123456 // $menu=>getmenu(test,item,get) //const string expressionPattern = "(/*/*|#*)\\$([_a-zA-Z][a-zA-Z0-9_]*)\\s*=\\s*(\"(\"|[^\"\\n])*\"|[^<>\\s\\n\"\\$/]+)(\\s+\\B)*"; const string expressionPattern = "(/*/*|#*)\\$([_a-zA-Z][a-zA-Z0-9_]*)\\s*=\\s*([^()]+)\\(((\\{[^}]*\\})|([^)]*))\\)"; //设置表达式 //const string specialVarPattern = "(item|cache|query|form)\\([\"']*(.+?)[\"']*\\)"; //特殊数据 var outHtml = Regex.Replace(content, expressionPattern, m => { //注释 if (m.Groups[1].Value != "") { return(String.Empty); } //获取变量及表达式 var varName = m.Groups[2].Value; var expName = m.Groups[3].Value; var expValue = TemplateUtils.GetFunctionParamValue(m.Groups[4].Value); var value = String.Empty; switch (expName) { case "item": value = dc.GetAdapter().GetItem(expValue).ToString(); break; case "cache": value = dc.GetAdapter().GetCache(expValue).ToString(); break; case "query": value = dc.GetAdapter().GetQueryParam(expValue); break; case "form": value = dc.GetAdapter().GetFormParam(expValue); break; } dc.DefineVariable(varName, value ?? ""); /* * } * else * { * string varRealValue = Regex.Replace(expValue, "\\B\"|\"\\B", String.Empty); * * //如果为字符,否则读取指定值的变量 * if (Regex.IsMatch(expValue, "\\B\"|\"\\B")) * { * dc.DefineVariable(varName, varRealValue); * } * else * { * object obj = dc.GetVariable(varRealValue); * if (obj != null) * { * if (obj is Variable) * { * dc.DefineVariable(varName, (Variable) obj); * } * else * { * dc.DefineVariable(varName, obj.ToString()); * } * } * else * { * string message = ""; * int i = 0; * foreach (string key in dc.GetDefineVariable().Keys) * { * message += (++i == 1 ? "" : "," + key); * } * throw new NotSupportedException("数据引用键错误:" + m.Value + "\n" + + (message != "" + ? "受支持可引用的数据键包括" + message + "\n使用\"$" + varName + + "=>键\"进行调用!" + : "")); + } + } + } */ return(String.Empty); }, RegexOptions.Singleline); return(outHtml); }
/// <summary> /// 赋值到变量 /// $v = form('key') /// </summary> private static string SetToVariable(IDataContainer dc, string content) { //正则模式,支持以下 // //$menu="123456\" f" sdf // $menu=12 fsdf // $menu=item:123456 // $menu=>getmenu(test,item,get) const string expressionPattern = "(/*/*|#*)\\$([_a-zA-Z][a-zA-Z0-9_]*)\\s*=\\s*(\"(\"|[^\"\\n])*\"|[^<>\\s\\n\"\\$/]+)(\\s+\\B)*"; //设置表达式 const string specialVarPattern = "(item|cache|query|form)\\([\"']*(.+?)[\"']*\\)"; //特殊数据 string outHtml, varName, varValue, varKey; Match valueMatch; outHtml = Regex.Replace(content, expressionPattern, m => { //注释 if (m.Groups[1].Value != "") { return(String.Empty); } //获取变量及表达式 varName = m.Groups[2].Value; varValue = m.Groups[3].Value; if (Regex.IsMatch(varValue, specialVarPattern, RegexOptions.IgnoreCase)) { valueMatch = Regex.Match(varValue, specialVarPattern, RegexOptions.IgnoreCase); varKey = valueMatch.Groups[2].Value; var varType = valueMatch.Groups[1].Value.ToLower(); object value = ""; switch (valueMatch.Groups[1].Value.ToLower()) { case "item": value = dc.GetAdapter().GetItem(varKey); break; case "cache": value = dc.GetAdapter().GetCache(varKey); break; case "query": value = dc.GetAdapter().GetQueryParam(varKey); break; case "form": value = dc.GetAdapter().GetFormParam(varKey); break; } dc.DefineVariable(varName, value); } else { string varRealValue = Regex.Replace(varValue, "\\B\"|\"\\B", String.Empty); //如果为字符,否则读取指定值的变量 if (Regex.IsMatch(varValue, "\\B\"|\"\\B")) { dc.DefineVariable(varName, varRealValue); } else { object obj = dc.GetVariable(varRealValue); if (obj != null) { if (obj is Variable) { dc.DefineVariable(varName, (Variable)obj); } else { dc.DefineVariable(varName, obj.ToString()); } } else { string message = ""; int i = 0; foreach (string key in dc.GetDefineVariable().Keys) { message += (++i == 1 ? "" : "," + key); } throw new NotSupportedException("数据引用键错误:" + m.Value + "\n" + (message != "" ? "受支持可引用的数据键包括" + message + "\n使用\"$" + varName + "=>键\"进行调用!" : "")); } } } return(String.Empty); }, RegexOptions.Singleline); return(outHtml); }