编程语言
首页 > 编程语言> > 在C#中,如何评估类的任何成员是否包含switch大小写或其他构造?

在C#中,如何评估类的任何成员是否包含switch大小写或其他构造?

作者:互联网

在C#中,如何评估类的任何成员是否包含switch大小写或其他构造?我想检查单元测试中是否已使用switch … case或链式if …. else编写了一个类.

我知道如何使用反射来获取类的成员,但是无法在网络上找到如何获取实际代码的示例.从this SO帖子中,我发现您可以使用MethodBase.GetMethodBody(),here.这对于返回MethodBody以获取变量似乎很有用,但是找不到如何获取信息,例如switch … case或if … else是否存在.

有可用的解决方案吗?

解决方法:

你不能用反射做到这一点.是的,您可以获得方法IL字节数组,但对您的要求没有用.

实现您所需的最佳方法是使用Roslyn,然后再简单不过了.

bool ContainsIfElseOrSwitchTest()
{
    var classToTest = // you can get it from your VS solution 
                      // or by reading the .cs file from disk
    // for example
    classToTest = CSharpSyntaxTree.ParseText(File.OpenRead(pathToFile));

    return classToTest.GetRoot().DescendantNodes().
              Any(node => node is SwitchStatementSyntax || node is IfStatementSyntax);
}

根据评论更新答案.

另一种选择是使用Mono.Cecil直接获取IL指令,而无需使用字节数组.但是您必须知道,您只能知道指令中是否包含条件,而不能知道是否还有其他条件或切换.

当然,其他选择是解析您自己的文本并找到您想要的.

标签:system-reflection,reflection,c,methodbase
来源: https://codeday.me/bug/20191111/2021881.html