当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > .Net学习:IronPython分析Lambda表达式

ASP.NET
Visual Studio.Net 内幕(7)
.Net 2.0 原汁原味读取注册表
ASP.NET 2.0中预设的cookie
ASP.NET:一段比较经典的多线程学习代码
ASP.NET2.0服务器控件之自定义状态管理
Asp.net给站点某目录增加Aspnet用户
ASP.NET技巧:请求网址并解析返回的html
在Asp.net用C#建立动态Excel
ASP.NET2.0:页面中链入的CSS、js文件带中文时需注意
ASP.NET技巧:数据岛出到Excel最为简易的方法
第一次用.net2.0 LOGIN登陆控件的困惑和解决方法
在ASP.net中保存/取出图片入/从SQL数据库
ASP.NET技巧:做个DataList可分页的数据源
在.NET中利用委托实现窗体间通信
在.NET2.0中使用自定义事务操作
解决 ASP.NET中目录访问权限的问题
ASP.Net防止刷新自动触发事件的解决方案
白刃之战:PHP vs. ASP.NET(节选)-架构比较
C#中使用SendMessage
提取HTML代码中文字的C#函数

ASP.NET 中的 .Net学习:IronPython分析Lambda表达式


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 142 ::
收藏到网摘: n/a

在我们的.Net项目中,要使用到自定义公式功能,我们利用了IronPython的Lambda功能,可以方便的计算值,但是我们发现,如果表达式涉及的属性发生改变时,公式必须重新计算,怎样析表达式知道到底访问了哪些属性呢?

在我们的.Net项目中,要使用到自定义公式功能,我们利用了IronPython的Lambda功能,可以方便的计算值,但是我们发现,如果表达式涉及的属性发生改变时,公式必须重新计算,怎样析表达式知道到底访问了哪些属性呢?

仔细研究发现IronPython提供了这样的功能:

上面的代码分析了表达式: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);
   }
   }