2017-02-13 67 views
3

在C#中,如何評估一個類的任何成員是否包含switch case或者其他構造?我想在單元測試中檢查一個班級是否已寫入switch...case或鏈接if....else在C#中,我該如何評估一個類的任何成員是否包含switch case或其他構造?

我知道如何使用反射獲得類的成員,但無法找到如何獲得實際代碼的interwebs上的示例。從this SO貼子我發現你可以使用MethodBase.GetMethodBody()here。這對於返回MethodBody獲取變量似乎很不錯,但無法找到如何獲取switch...caseif...else是否存在的信息。

任何解決方案?

+1

你看到的['MethodBody.GetILAsByteArray()'方法](https://msdn.microsoft.com /en-us/library/system.reflection.methodbody.getilasbytearray.aspx)? –

+1

您是否在尋找*任何*控制流程或僅僅這兩個構造具體?當它被編譯成IL時,這些結構不再存在。所以如果你只想定位這些結構,你就會嘗試從IL中反向工程。 –

+0

@RowlandShaw - 我撇清了它,因爲我真的不知道它會有什麼幫助。我認爲它會有一些特定的IL,然後我可以搜索。我正確地認爲'switch ... case'和'if ... else'都編譯成相同的IL指令嗎? – Dib

回答

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 elseswitch

其他選項,當然是要分析文本自己,找到你想要的..

+0

這將是偉大的,但我沒有任何與編譯器的選擇。它的''C#6.0(單聲道JIT編譯器版本4.0。1通過mono-complete軟件包安裝) – Dib

+1

@Dib請檢查更新請 –

+0

我已經檢查過MonoCecil,因爲解析文本是首選,但我無權訪問任何引用或添加任何新軟件包。這是一種恥辱,因爲我不需要知道它是否特別是'if ... else'或'switch ... case',但是如果已經使用了。我正在得出結論,我的手腕是如何綁定的,不會有解決辦法。 – Dib

相關問題