All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
开始了解,PHP,V5,中的对象_php资料_编程技术
Asp.net动态生成页面控件的办法_[Asp.Net教程]
XSL学习心得-制作图像超链接_[XML教程]
C#,3.0新特性体验之Lambda表达式_[Asp.Net教程]
配置错误,无法识别的配置节“connectionStrings”_[Asp.Net教程]
LINQ体验(8)——LINQ,to,SQL语句之Union,All,、Union、,Intersect
最近收集的有用的Javscript小技巧_JavaScript技术_编程技术
独家:C#数据库操作的三种经典用法_.net资料_编程技术
浅谈数据库设计技巧(上)_mssql学习_编程技术
SQL Server数据库恢复操作实例_[SQL Server教程]
Reading number is top 10 pictures
遇到插队的怎么办?
初吻给了谁?
9.3阅兵全景图4-陸海空现代化兵种方阵梯队
中国处女图鉴1
Ashlynn Brooke a group sexy photo4
BingBingFan apple dew point photo gallery4
So beauty, will let you spray blood7
谁认识这位校花
A man's favorite things2
小学生考试又现神作--还有外国的
Download software ranking
ASP.NET.2.0.XML.高级编程(第3版)
Boxer's Top ten classic battle4
Adobe Flash Player(IE) 10.0.32.18 浏览器专用的FLASH插件
C语言教程TXT
美女游泳记
虚拟机5.5.3版
Boxer Classic video2
Boxer's Top ten classic battle3
Rio big adventure
Boxer Classic video3
aaa published in(发表于) 2013/12/18 7:51:54 Edit(编辑)
.Net学习,使用IronPython分析Lambda表达式_.net资料_编程技术

.Net学习,使用IronPython分析Lambda表达式_.net资料_编程技术

.Net学习 使用IronPython分析Lambda表达式_.net资料_编程技术-你的首页-uuhomepage.com

  在我们的.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);
   }
   }





添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.