2

我正在开发一个 WPF 应用程序来验证文件中的 C# 代码。

我能够获取该文件,并根据不同的需要实例化它的类型。

现在我需要的是根据我设置的一些标准验证该代码。我是什么意思?

假设我有一个文件“Test.cs”,这个文件有以下代码:

using xpto;
using abcd;

public class Test
{
    public static void Testing()
    {
        Iqueryable<XYZ> var1 = ctx.Where(c => c.IdSomething == number);
        var1 = var1.Where(v => v.Count(x => x.ValZ) > 0);
    }
}

在我的应用程序中,我会实例化这个文件(已经完成),然后根据一些规则对其进行验证。例如,在这一行中:

var1 = var1.Where(v => v.Count(x => x.ValZ) > 0);

我想告诉该文件正在使用Count(...) > 0而不是Any(). 我知道这可以通过文本读取文件来完成,但我想知道是否可以使用反射或任何其他不需要这种硬编码的方式。这就是我实例化文件的方法(这是一个工作示例):

CompilerResults cr = provider.CompileAssemblyFromFile(cp, sourceFile.FullName);
Type instanceType = cr.CompiledAssembly.GetExportedTypes()
    .FirstOrDefault(e => e.Name.Equals(className));

如果不清楚,请告诉我,以便我尝试详细说明。

4

1 回答 1

7

好吧,即使问题过于笼统,您也可以使用Microsoft Roslyn来解决。编译器作为一种服务,您可以使用它AST从提供的代码中获取并接收您需要的所有必要信息。

由于这是一件大事,因此很难在这里给出一些简短且不言自明的答案。查看“如何运行东西”的具体示例更容易,例如这里:

Roslyn CTP:三个介绍性项目

于 2012-12-05T18:18:40.620 回答