麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > JavaScript > 正文

關(guān)于模板中的動(dòng)態(tài)取值 ---反射與javascript腳本編譯

2019-11-17 02:20:26
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

關(guān)于模板中的動(dòng)態(tài)取值 ---反射與javascript腳本編譯

在項(xiàng)目中經(jīng)常遇到一個(gè)問(wèn)題,打印Word或者打印Excel的時(shí)候,我們經(jīng)常使用一對(duì)一的賦值或者批量替換的方式來(lái)對(duì)模板進(jìn)行修改。

但是現(xiàn)在遇到兩種場(chǎng)景:

1、取值是通過(guò)自定以方法進(jìn)行取值的。

如:一個(gè)銷售單據(jù),會(huì)涉及到很多種費(fèi)用,并且這些費(fèi)用是由后臺(tái)配置的,非常靈活。但是我們?cè)谥谱鞔蛴∧0鍟r(shí)取值各項(xiàng)費(fèi)用我們?cè)撊绾稳ザx他呢,如何給他賦值呢?我們?nèi)绻槍?duì)這一個(gè)場(chǎng)景下的模板進(jìn)行一個(gè)特殊定義后,在打印另一份單據(jù)或者遇到同樣的取值非常靈活的數(shù)據(jù),是不是也需要進(jìn)行特殊處理呢。

2、取值是通過(guò)自行定義進(jìn)行取值的。

如:還是一個(gè)銷售單據(jù),我們打印的可能是銷售價(jià)格,成本、毛利,但是如果我們打印的時(shí)候涉及到提成配比,提成配比可能是根據(jù)銷售價(jià)格算的,可能根據(jù)毛利算的,可能根據(jù)效益來(lái)算的,那么是不是我們?cè)谧鲞@個(gè)模板的時(shí)候定義:提成(按成本)、提成(按毛利)、提成...。

在這中情況下,我的解決方案是采用反射與Javascript進(jìn)行處理:

這里大致講述一下我的解決思路,各位過(guò)路大神,各位奮戰(zhàn)一線的程序猿們,看過(guò)笑過(guò),不喜勿噴~

第一步:建立兩種Eval方法,來(lái)解析表達(dá)式

C#Eval反射式:(此種方式主要應(yīng)對(duì)在程序中自定義的方法,根據(jù)參數(shù)及方法來(lái)模擬程序中的計(jì)算,并將結(jié)果返回過(guò)去,這種方法必須制定處理他的主體Object)

/// <summary>/// CShrapEval 的摘要說(shuō)明/// </summary>public class CShrapEval{      /// <summary>    /// 計(jì)算結(jié)果,如果表達(dá)式出錯(cuò)則拋出異常    /// </summary>     public static object Eval(string action,Type type,object obj,object[] parm)    {        return type.InvokeMember(                    action,                    BindingFlags.InvokeMethod,                    null,                    obj,                  parm                  );    }    public static object Eval(string Cstring, Type type, object obj)    {        string action = Cstring.Split('|')[0];        object[] parm = Cstring.Split('|')[1].Split(',');        return type.InvokeMember(                    action,                    BindingFlags.InvokeMethod,                    null,                    obj,                  parm                 );    }}

  JavaScript腳本編譯方式:模擬javascript工作方式去處理一個(gè)表示式,可以使用一個(gè)javascript常用函數(shù)(如getdate() length等),靈活方便

/**//// <summary>/// 動(dòng)態(tài)求值/// </summary>public class JavaEval{    /**/    /// <summary>    /// 計(jì)算結(jié)果,如果表達(dá)式出錯(cuò)則拋出異常    /// </summary>    /// <param name="statement">表達(dá)式,如"1+2+3+4"</param>    /// <returns>結(jié)果</returns>    public static object Eval(string statement)    {        return _evaluatorType.InvokeMember(                    "Eval",                    BindingFlags.InvokeMethod,                    null,                    _evaluator,                    new object[] { statement }                 );    }    /**/    /// <summary>    ///     /// </summary>    static JavaEval()    {        //構(gòu)造JScript的編譯驅(qū)動(dòng)代碼        CodeDomPRovider provider = CodeDomProvider.CreateProvider("JScript");        CompilerParameters parameters;        parameters = new CompilerParameters();        parameters.GenerateInMemory = true;        CompilerResults results;        results = provider.CompileAssemblyFromSource(parameters, _jscriptSource);        Assembly assembly = results.CompiledAssembly;        _evaluatorType = assembly.GetType("Evaluator");        _evaluator = Activator.CreateInstance(_evaluatorType);    }    private static object _evaluator = null;    private static Type _evaluatorType = null;    /**/    /// <summary>    /// JScript代碼    /// </summary>    private static readonly string _jscriptSource =        @"class Evaluator              {                  public function Eval(expr : String) : String                   {                      return eval(expr);                   }              }";}

  第二步、構(gòu)建好兩個(gè)eval之后我們就需要在程序中去識(shí)別那些是C#,那些是javascript代碼斷

這里我處理的辦法是:<c...代碼 /> 和<J ...代碼 />使用這兩種方式分別標(biāo)示是那種代碼

然后在處理中我們只需要找出那些是C代碼 那些是J代碼,并且對(duì)代碼斷進(jìn)行計(jì)算

       public void ExportDoc()        {            ExportReplace();            foreach (NodeTemplate temp in DocTemplateList)            {                ExportDoc(temp);            }            if (ActionObject != null)            {                //動(dòng)態(tài)取值                ExportDymic();            }        }        //定義C表達(dá)式        System.Text.RegularExpressions.Regex RegexC = new System.Text.RegularExpressions.Regex(@"/<C/w*/|/w*[/,/w*]*///>");        //定義J表達(dá)式        System.Text.RegularExpressions.Regex RegexJ = new System.Text.RegularExpressions.Regex(@"/<J^/>*///>");        //業(yè)務(wù)邏輯理論為先處理C在處理J,但是C與J由存在循環(huán)處理的過(guò)程        public void ExportDymic()        {            var MatchesS = RegexC.Matches(doc.GetText());            foreach (System.Text.RegularExpressions.Match MatchC in MatchesS)            {                string Cstring = MatchC.Value.Replace("<C", "").Replace("http://>", "");                string result = CEval(Cstring);                //CShrapEval.Eval(Cstring, this.GetType(), this).ToString();                //A = A.Replace(MatchC.Value, result);                doc.Range.Replace(MatchC.Value, result, false, false);            }            MatchesS = RegexJ.Matches(doc.GetText());            foreach (System.Text.RegularExpressions.Match MatchC in MatchesS)            {                string Jstring = MatchC.Value.Replace("<J", "").Replace("http://>", "");                string result = JavaEval.Eval(Jstring).ToString();                doc.Range.Replace(MatchC.Value, result, false, false);            }                }        public string CEval(string A)        {            var MatchesS = RegexC.Matches(A);            foreach (System.Text.RegularExpressions.Match MatchC in MatchesS)            {                string Cstring = MatchC.Value.Replace("<C", "").Replace("http://>", "");                string result =  CEval(Cstring).ToString();                A = A.Replace(MatchC.Value, result);            }            MatchesS = RegexJ.Matches(A);            foreach (System.Text.RegularExpressions.Match MatchC in MatchesS)            {                string Jstring = MatchC.Value.Replace("<J", "").Replace("http://>", "");                string result = JEval(Jstring).ToString();                A = A.Replace(MatchC.Value, result);            }                     return CShrapEval.Eval(A, ActionObject.GetType(), ActionObject).ToString();        }        public string JEval(string A)        {            var MatchesS = RegexC.Matches(A);            foreach (System.Text.RegularExpressions.Match MatchC in MatchesS)            {                string Cstring = MatchC.Value.Replace("<C", "").Replace("http://>", "");                string result = CEval(Cstring).ToString();                A = A.Replace(MatchC.Value, result);            }             MatchesS = RegexJ.Matches(A);            foreach (System.Text.RegularExpressions.Match MatchC in MatchesS)            {                string Jstring = MatchC.Value.Replace("<J", "").Replace("http://>", "");                string result = JEval(Jstring).ToString();                A = A.Replace(MatchC.Value, result);            }            return JavaEval.Eval(A).ToString();        }

  

這樣就可以對(duì)表達(dá)進(jìn)行精確的解析了,當(dāng)然目前還有一些未考慮完全的地方 ,待各位看客老爺指點(diǎn)。

好的~今天就貼到這里, 后期看看被噴的程度來(lái)確定是否繼續(xù)在博客園發(fā)一些日志


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 午夜久久电影 | 国产精品一区二区x88av | 男女羞羞视频在线免费观看 | 国产精品观看在线亚洲人成网 | 久久国产精品久久久久 | 亚洲成人高清在线观看 | 国产免费人做人爱午夜视频 | 国产99精品视频 | 久久久一区二区三区四区 | 成人在线观看免费 | 亚州精品天堂中文字幕 | 欧美一级精品 | 视频在线中文字幕 | 中国女警察一级毛片视频 | 羞羞羞网站 | 日韩精品久久久 | 九九热精品在线视频 | 午夜精品久久久久久中宇 | 一级做a爰性色毛片免费1 | 亚洲人成在线播放网站 | 国产日韩在线观看视频 | 亚洲国产精品二区 | www.guochanav.com | 在线成人免费网站 | 国产成人在线视频播放 | 看91| 欧美一级做性受免费大片免费 | 久久伊人国产精品 | xp123精品视频 | 亚洲国产美女视频 | 大胆在线日本aⅴ免费视频 美国黄色毛片女人性生活片 | 在线中文字幕不卡 | 一级成人欧美一区在线观看 | 在线免费亚洲 | 美女黄影院 | 强伦女教师视频 | 一级电影免费看 | 免费香蕉成视频成人网 | 日本黄色免费观看视频 | 美女久久 | 一区二区久久精品66国产精品 |