国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Python > 正文

IronPython分析Lambda表達式

2024-07-21 02:30:20
字體:
來源:轉載
供稿:網友

在我們的.net項目中,要使用到自定義公式功能,我們利用了ironpython的lambda功能,可以方便的計算值,但是我們發現,如果表達式涉及的屬性發生改變時,公式必須重新計算,怎樣析表達式知道到底訪問了哪些屬性呢?

在我們的.net項目中,要使用到自定義公式功能,我們利用了ironpython的lambda功能,可以方便的計算值,但是我們發現,如果表達式涉及的屬性發生改變時,公式必須重新計算,怎樣析表達式知道到底訪問了哪些屬性呢?

仔細研究發現ironpython提供了這樣的功能:

以下為引用的內容:

systemstate state = new systemstate();
   compilercontext context = new compilercontext();
  
   parser p = parser.fromstring(state, context, "activeobject.contact.address + 'ds'");
   ironpython.compiler.ast.expression ex = p.parsetestlistasexpression();

上面的代碼分析了表達式:activeobject.contact.address + 'ds', 這里用了parser類可以分析出表達式,使用vs對象查看器,可以理解結果:

問題還沒有完全解決,我想結果有了,我總不能自己遞歸所有結構吧?哇,怎么也有20多種類型,在看看,嗯,還有這個:

以下為引用的內容:

  class program {
   static void main(string[] args) {
   systemstate state = new systemstate();
   compilercontext context = new compilercontext();
  
   parser p = parser.fromstring(state, context, "activeobject.contact.address + 'ds'");
   ironpython.compiler.ast.expression ex = p.parsetestlistasexpression();
  
   mywalker w = new mywalker();
   ex.walk(w);
   }
   }
  
   class mywalker : astwalker {
   public override bool walk(fieldexpression node) {
   console.writeline("walk:{0},{1}", node.name, node.target);
   return base.walk(node);
   }
   }

cool!!我重載的虛方法被調用了兩次,告訴我有2次字段的訪問。

在.net 3.5中提供了lambda的結構描述類,但我是沒有找到動態編譯分析的類。看博客園的朋友說:本來有個dynamicexpression的類提供了動態編譯功能,但是現在的.net 3.5砍掉了,但是在linq 101 samples中卻有源代碼,靠。

注意:本程序使用ironpython 的1.0版本,2.0版本的方法已經不同。 下面是2.0的代碼:

以下為引用的內容:

class program {
   static void main(string[] args) {
   //引擎
   ironpython.hosting.pythonengine engine = ironpython.hosting.pythonengine.currentengine;
   //代碼單元
   sourcecodeunit unit = new sourcecodeunit(engine, "activeobject.contact.address + 'ds'");
   //上下文和選項
   compilercontext context = new compilercontext(unit);
   ironpython.pythonengineoptions option = new ironpython.pythonengineoptions();
  
   //分析表達式
   parser p = parser.createparser(context,option);
   ironpython.compiler.ast.expression ex = p.parseexpression();
  
   //遞歸查找
   mywalker w = new mywalker();
   ex.walk(w);
   }
   }
   class mywalker : pythonwalker {
   public override bool walk(memberexpression node) {
   console.writeline("walk:{0},{1}", node.name, node.target);
   return base.walk(node);
   }
   }


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 万安县| 台中市| 高阳县| 潮州市| 双牌县| 德州市| 房产| 绿春县| 会昌县| 神农架林区| 项城市| 长白| 黄大仙区| 余姚市| 雷波县| 林周县| 丽江市| 余干县| 永清县| 丁青县| 湘乡市| 区。| 长葛市| 永新县| 古浪县| 兰考县| 梅州市| 乐亭县| 柳河县| 方城县| 赤水市| 隆子县| 阳西县| 桂林市| 嵩明县| 社旗县| 关岭| 芦山县| 唐山市| 安达市| 新宁县|