国产探花免费观看_亚洲丰满少妇自慰呻吟_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);
   }
   }


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 辛集市| 东城区| 凌云县| 马关县| 浦北县| 潢川县| 宜兰县| 西乡县| 开远市| 岳普湖县| 满洲里市| 右玉县| 高密市| 隆尧县| 黄陵县| 什邡市| 梨树县| 玉溪市| 清水河县| 华池县| 咸阳市| 淄博市| 阳西县| 天镇县| 尚志市| 固镇县| 松江区| 淄博市| 屯门区| 华坪县| 榕江县| 昌邑市| 洛川县| 兴义市| 丰宁| 垦利县| 都安| 烟台市| 承德县| 通渭县| 沅陵县|