在C#中,我如何评估一个类的任何成员是否包含switch case或if else构造?

时间:2017-02-13 08:48:06

标签: c# reflection system.reflection methodbase

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

我知道如何使用反射获取类的成员,但是无法在如何获取实际代码的互联网上找到示例。来自this SO帖子我发现您可以使用MethodBase.GetMethodBody()here。返回MethodBody获取变量似乎很棒,但无法找到如何获取switch...caseif...else是否存在的信息。

有哪些解决方案?

1 个答案:

答案 0 :(得分: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 else还是switch

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