欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【.Net学习:IronPython分析Lambda表达式】,下面是详细的分享!
.Net学习:IronPython分析Lambda表达式
在我们的.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); } } |
以上所分享的是关于.Net学习:IronPython分析Lambda表达式,下面是编辑为你推荐的有价值的用户互动:
相关问题:.net lambda表达式树如何写部分动态查询
答:有个类叫Dynamic.cs,微软开源的,自己网上搜一下,它的运行示例如下所示 var query = db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10). OrderBy("CompanyName"). Select("New(CompanyName as Name, Phone)"); >>详细
相关问题:.NET 关于linq和lambda表达式的查询问题
答:属于一对多表,一个用户有多个权限. 怎么查到用户未拥有的权限,如下: @userid转入用户ID ,思路:以权限表group表为主表,查询用户已有的权限不在主表之类的就是-》未拥有的权限 sql语句子查询操作! select * from group where groupid not in(s... >>详细
相关问题:.net MVC 中会lambda表达式,我应该从哪里开始学起?
答:从委托学起,然后是linq,然后才是lambda。 强烈推荐你看,基本就是沿着这条主线讲的。 >>详细
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
