Web Analytics
yangyang

码农兼一个普普通通小青年

Roslyn


实现一个简单的基于语义的C#代码比较工具

代码比较功能在很多版本管理工具中都存在,比如Git和TortoiseSVN,Compare Beyond中也有。这个功能可以很方便的帮助我们查看代码的变更。目前这些工具都是简单的基于文本差异的比较。然而在有些时候,我们需要基于语义的比较,比如在代码中,我只是调整了方法的前后顺序、添加了一些注释、删除了一些语句之间的空格,或是将一个大的类使用partial关键字,拆分到多个源文件中。在这种情况下,传统的基于简单文本进行代码比较的方式则失去了应有的作用。我们需要保证代码的逻辑和正确定不变即可,而不关心代码的书写格式,比如行号,空格,注释,格式化这些。本文基于Roslyn实现了一个简单的基于语义的C#代码比较工具。 …

Roslyn Semantic Analysis

将条件字符串解析为lambda表达式

将条件字符串动态解析并转换为lambda表达式在很多场景下非常有用,它一方面便于实现逻辑和配置的分离,另一方面也提供了更大的灵活性。在很多场景我们都能看到这种将条件表达式字符串保存起来,然后动态解析执行的列子,比如股票软件里面的公式编辑器、比如规则引擎RulesEngine。通常,要手动实现将条件表达式字符串解析为lambda表达式是困难的,因为这会用到一些编译器里面类似的诸如语法分词,词法分析的内容。 虽然在C#中,可以运用之前介绍的表达式树ExpressionTree来一定程序上简化这些操作,但要手动解析,仍然十分繁琐。本文站在巨人的肩膀上介绍两种,一种是System.Linq.Dynamic.Core,一种是使用Roslyn的Microsoft.CodeAnalysis.Scripting。 …

RulesEngine Roslyn lambda ExpressionTree CodeAnalysis Dynamic LINQ

  • 1