2017-02-13 8 views
3

В C#, как я могу оценить, содержат ли какие-либо члены класса ключ переключения или если else строит? Я хочу проверить модульный тест, если класс был написан либо с switch...case, либо с цепью if....else.В C#, как я могу оценить, содержат ли какие-либо члены класса ключ switch или если else строит?

Я знаю, как получить членов класса с использованием отражения, но не могу найти пример на interwebs того, как получить фактический код. От this SO post Я нашел, что вы можете использовать MethodBase.GetMethodBody(), here. Это кажется хорошим для возврата MethodBody для получения переменных, но не может найти, как получить информацию о том, существует ли switch...case или if...else.

Доступны любые решения?

+1

ли вы видите [ 'MethodBody.GetILAsByteArray()' Метод] (https://msdn.microsoft.com /en-us/library/system.reflection.methodbody.getilasbytearray.aspx)? –

+1

Вы ищете * любой * поток управления или только эти две конструкции конкретно? К тому времени, когда он был скомпилирован в IL, эти конструкции больше не существуют. Поэтому, если вы хотите настроить таргетинг только на те конструкции, вы будете пытаться перепроектировать из IL. –

+0

@RowlandShaw - Я просмотрел его, поскольку я не был уверен, как это поможет. Я предполагаю, что там будет какой-то конкретный ИЛ, который я могу найти. Я исправлю, что и «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); 
} 

Update ответ, основанный на комментарий.

Другой вариант - использовать Mono.Cecil, чтобы получить непосредственно инструкции IL без использования массива байтов. Но вы должны знать, что можете просто знать, содержат ли инструкции условия, и вы не можете знать, является ли это if else или switch.

Другой вариант, это, конечно, разобрать текст в себя и найти то, что вы хотите ..

+0

Это было бы здорово, но у меня нет выбора с компилятором. Его - 'C# 6.0 (Mono JIT компилятор версии 4.0.1 установлен через моно-полный пакет) ' – Dib

+1

@Dib Проверьте обновление, пожалуйста, –

+0

Я проверил MonoCecil, поскольку разбор текста будет предпочтительным, однако у меня нет доступа для включения каких-либо ссылок или добавления новых пакетов. Это позор, поскольку мне не нужно знать, является ли это особым 'if ... else' или' switch ... case', но если он был использован. Я прихожу к выводу, что мои запястья связаны, не будет решения. – Dib

 Смежные вопросы

  • Нет связанных вопросов^_^