亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

關于模板中的動態取值 ---反射與javascript腳本編譯

2019-11-17 02:20:26
字體:
來源:轉載
供稿:網友

關于模板中的動態取值 ---反射與javascript腳本編譯

在項目中經常遇到一個問題,打印Word或者打印Excel的時候,我們經常使用一對一的賦值或者批量替換的方式來對模板進行修改。

但是現在遇到兩種場景:

1、取值是通過自定以方法進行取值的。

如:一個銷售單據,會涉及到很多種費用,并且這些費用是由后臺配置的,非常靈活。但是我們在制作打印模板時取值各項費用我們該如何去定義他呢,如何給他賦值呢?我們如果針對這一個場景下的模板進行一個特殊定義后,在打印另一份單據或者遇到同樣的取值非常靈活的數據,是不是也需要進行特殊處理呢。

2、取值是通過自行定義進行取值的。

如:還是一個銷售單據,我們打印的可能是銷售價格,成本、毛利,但是如果我們打印的時候涉及到提成配比,提成配比可能是根據銷售價格算的,可能根據毛利算的,可能根據效益來算的,那么是不是我們在做這個模板的時候定義:提成(按成本)、提成(按毛利)、提成...。

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

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

第一步:建立兩種Eval方法,來解析表達式

C#Eval反射式:(此種方式主要應對在程序中自定義的方法,根據參數及方法來模擬程序中的計算,并將結果返回過去,這種方法必須制定處理他的主體Object)

/// <summary>/// CShrapEval 的摘要說明/// </summary>public class CShrapEval{      /// <summary>    /// 計算結果,如果表達式出錯則拋出異常    /// </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工作方式去處理一個表示式,可以使用一個javascript常用函數(如getdate() length等),靈活方便

/**//// <summary>/// 動態求值/// </summary>public class JavaEval{    /**/    /// <summary>    /// 計算結果,如果表達式出錯則拋出異常    /// </summary>    /// <param name="statement">表達式,如"1+2+3+4"</param>    /// <returns>結果</returns>    public static object Eval(string statement)    {        return _evaluatorType.InvokeMember(                    "Eval",                    BindingFlags.InvokeMethod,                    null,                    _evaluator,                    new object[] { statement }                 );    }    /**/    /// <summary>    ///     /// </summary>    static JavaEval()    {        //構造JScript的編譯驅動代碼        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);                   }              }";}

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

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

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

       public void ExportDoc()        {            ExportReplace();            foreach (NodeTemplate temp in DocTemplateList)            {                ExportDoc(temp);            }            if (ActionObject != null)            {                //動態取值                ExportDymic();            }        }        //定義C表達式        System.Text.RegularExpressions.Regex RegexC = new System.Text.RegularExpressions.Regex(@"/<C/w*/|/w*[/,/w*]*///>");        //定義J表達式        System.Text.RegularExpressions.Regex RegexJ = new System.Text.RegularExpressions.Regex(@"/<J^/>*///>");        //業務邏輯理論為先處理C在處理J,但是C與J由存在循環處理的過程        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();        }

  

這樣就可以對表達進行精確的解析了,當然目前還有一些未考慮完全的地方 ,待各位看客老爺指點。

好的~今天就貼到這里, 后期看看被噴的程度來確定是否繼續在博客園發一些日志


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品美女国产在线| 国产精品极品美女粉嫩高清在线| 色婷婷av一区二区三区久久| 国产精品亚洲аv天堂网| 亚洲剧情一区二区| 色爱精品视频一区| 日韩三级影视基地| 91精品久久久久久久久久久久久久| 亚洲欧美在线磁力| 成人免费网站在线| 欧美亚洲免费电影| 青草热久免费精品视频| 在线播放国产精品| 国产午夜精品全部视频在线播放| 日韩欧美国产一区二区| 亚州精品天堂中文字幕| 亚洲男人的天堂在线| 欧美极品少妇xxxxⅹ喷水| 亚洲欧美精品伊人久久| 亚洲精品美女在线| 亚洲日本中文字幕免费在线不卡| 欧美激情精品久久久久久久变态| 亚洲成人久久网| 亚洲第一网中文字幕| 国产精品69av| 国产精品美女免费看| 日韩精品在线第一页| 久久久久国产精品一区| 国产精品99久久久久久www| 亚洲精品国精品久久99热| www高清在线视频日韩欧美| 国产精品久久久91| 久久视频在线看| 欧美极品美女视频网站在线观看免费| 亚洲欧洲一区二区三区久久| 亚洲黄在线观看| 国产精品网址在线| 久久精品国产亚洲一区二区| 伊人久久久久久久久久| 琪琪第一精品导航| 日本中文字幕成人| 一区三区二区视频| 久久亚洲精品一区二区| 少妇高潮久久77777| 久久久久久久久综合| 国产香蕉一区二区三区在线视频| 国产精品精品国产| 国产成人jvid在线播放| 国产精品网红福利| 亚洲一区免费网站| 川上优av一区二区线观看| 青草青草久热精品视频在线网站| 激情av一区二区| 日韩精品999| 日韩精品福利在线| 51久久精品夜色国产麻豆| 精品亚洲一区二区三区四区五区| 91精品国产乱码久久久久久久久| 久久影视三级福利片| 狠狠干狠狠久久| 久久亚洲国产精品| 亚洲最大福利视频网| 亚洲美女久久久| 国产精品免费看久久久香蕉| 欧美精品在线免费观看| 福利视频导航一区| 国产a∨精品一区二区三区不卡| 亚洲色图狂野欧美| 国产精品入口夜色视频大尺度| 日韩欧美在线视频免费观看| 疯狂蹂躏欧美一区二区精品| 色婷婷综合成人av| 在线看欧美日韩| 欧美激情在线一区| 欧美成人免费va影院高清| 亚洲欧美日韩久久久久久| 国产精品91在线观看| 亚洲成人久久久久| 国产在线拍偷自揄拍精品| 欧美日韩国产区| 国产精品免费久久久| 欧美亚洲视频一区二区| 一本大道香蕉久在线播放29| 欧美国产精品日韩| 91久久精品国产91久久| 中文在线资源观看视频网站免费不卡| 国产99久久精品一区二区 夜夜躁日日躁| 欧美成人精品一区二区三区| 亚洲人成欧美中文字幕| 欧美资源在线观看| 日韩在线欧美在线| www高清在线视频日韩欧美| 欧美日韩中文字幕综合视频| 欧美激情精品久久久久久大尺度| 亚洲视频网站在线观看| 性色av香蕉一区二区| 色青青草原桃花久久综合| 国产精品自拍网| 日韩欧美中文字幕在线播放| 成人在线观看视频网站| 久久99国产精品自在自在app| 欧美亚洲视频在线看网址| 精品久久久一区| 尤物九九久久国产精品的特点| 国产精品自拍偷拍| 欧美二区乱c黑人| 夜夜嗨av一区二区三区四区| 国产免费一区视频观看免费| 成人精品aaaa网站| 中文字幕欧美精品在线| 久久久久久久久中文字幕| 久久99国产综合精品女同| 亚洲一区二区三区四区在线播放| 日韩欧美国产成人| 亚洲电影免费在线观看| 欧美猛男性生活免费| 国产精品一区二区三区免费视频| 亚洲欧美在线一区| 久久精品国产亚洲精品2020| 亚洲精品自拍第一页| 国产精品网站视频| 91精品视频免费看| 欧美在线影院在线视频| 国产在线观看一区二区三区| 国产精品久久久久久久久久小说| 成人激情视频在线观看| 在线成人中文字幕| 日韩久久精品电影| 欧美大奶子在线| 国产精品久久久久影院日本| 色老头一区二区三区| 国产精品久久久久久影视| 国产综合久久久久| 国产精品久久久999| 欧美日韩高清在线观看| 韩国三级电影久久久久久| 精品无码久久久久久国产| 在线视频欧美日韩| www.亚洲人.com| 狠狠色狠狠色综合日日五| 高潮白浆女日韩av免费看| 欧美中文字幕在线| 国产一区二区成人| 国产一区二区三区在线观看视频| 欧美久久精品一级黑人c片| 国产精自产拍久久久久久蜜| 66m—66摸成人免费视频| 米奇精品一区二区三区在线观看| 这里只有精品视频在线| 中国china体内裑精亚洲片| 精品综合久久久久久97| 亚洲3p在线观看| 日本精品视频在线播放| 欧美电影免费观看高清完整| 亚洲色图日韩av| 欧美亚洲国产成人精品| 日韩精品福利在线| 日韩毛片中文字幕| 精品久久香蕉国产线看观看亚洲| 奇米成人av国产一区二区三区| 日韩免费在线看| 中文字幕成人精品久久不卡| 久久露脸国产精品| 国产激情久久久久|