3

在 C# 中,我如何评估一个类的任何成员是否包含 switch case 或 if else 构造?我想检查一个单元测试,如果一个类是用 anyswitch...case或 chained编写的if....else

我知道如何使用反射获取类的成员,但在互联网上找不到如何获取实际代码的示例。从这个SO 帖子我发现你可以MethodBase.GetMethodBody()这里使用。这似乎很适合返回MethodBody以获取变量,但无法找到如何获取 a switch...caseor是否if...else存在的信息。

有什么可用的解决方案吗?

4

1 回答 1

3

你不能用反射来做到这一点。是的,您可以获得方法 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 指令而不使用字节数组。但是你必须知道,你只能知道指令是否包含条件,你不能知道它是if elseor switch

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

于 2017-02-13T09:27:20.390 回答