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

ASP.NET
二级域名Cookie问题的解决方法
如何为asp.net网站项目添加子项目
asp.net用url重写URLReWriter实现任意二级域名
asp.net 序列化and反序列化演示
asp.net Timer的使用方法
AjaxControlToolKit DropDownExtender(下拉扩展控件)使用方法
AjaxControlToolKit CalendarExtender(日历扩展控件)的使用方法
让GridView只显示特定用户的数据的方法
让GridView只更新某些特定的数据的方法
ajaxControlToolkit中CascadingDropDown的用法说明
axp.net ScriptManager的简单用法
把程序集安装到全局程序集缓存中的步骤
引用全局程序集缓存内的程序集的方法
asp.net COOKIES需要注意的一点
asp.net UrlReWriter使用经验小结
页面导出为Excel的时间格式的问题
asp.net cookie清除的代码
Asp.net XMLHTTP封装类(GET,Post发送和接收数据)
ASP.NET XmlHttp跨域访问实现代码
Asp.NET 随机码生成基类(随机字母,随机数字,随机字母+数字)

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 224 ::
收藏到网摘: 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);
   }
   }