在我们的项目中,要使用到自定义公式功能,我们利用了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);
}
}
仔细研究发现IronPython提供了这样的功能:






问题还没有完全解决,我想结果有了,我总不能自己递归所有结构吧?哇,怎么也有20多种类型,在看看,嗯,还有这个:



















Cool!!我重载的虚方法被调用了两次,告诉我有2次字段的访问。
在.NET 3.5中提供了Lambda的结构描述类,但我是没有找到动态编译分析的类。看博客园的朋友说:本来有个DynamicExpression的类提供了动态编译功能,但是现在的.NET 3.5砍掉了,但是在Linq 101 samples中却有源代码,靠。
注意:本程序使用IronPython 的1.0版本,2.0版本的方法已经不同。 下面是2.0的代码:


























【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构