Как разобрать простой оператор в объект CodeDom

Мне нужно разобрать простой оператор (по сути, цепочку вызовов функций для некоторого объекта), представленную в виде строковой переменной, в объект CodeDom (вероятно, подкласс CodeStatement). Я также хотел бы предоставить некоторые импорты пространств имен по умолчанию, чтобы иметь возможность использовать менее подробные операторы.

Я просмотрел SO и Интернет, чтобы найти несколько предложений, но я совершенно не понимаю, что возможно, а что нет, и как это сделать проще всего. Например, этот вопрос кажется почти тем, что я хочу, к сожалению, я не могу использовать решение поскольку CodeSnippetStatement, похоже, не поддерживается механизмом выполнения, который я использую (механизм правил WF).

Любые предложения, которые могли бы помочь мне / указать мне в правильном направлении?


person Tomas Vana    schedule 16.03.2010    source источник


Ответы (2)


В стандартных библиотеках .NET нет библиотеки или функции для анализа кода C# в объекты CodeDOM. В библиотеках CodeDOM есть несколько методов, которые, кажется, предназначены для этого, но на самом деле ни один из них не реализован. Насколько я знаю, в Visual Studio есть некоторая реализация (используемая, например, дизайнерами), но только внутренняя.

CodeSnippetStatement — это узел CodeDOM, который позволяет поместить любую строку в сгенерированный код. Если вы хотите создать дерево CodeDOM только для генерации исходного кода C#, это обычно нормально (генератор исходного кода просто печатает строку на выходе). Если движку WF нужно понимать код в вашей строке (а не просто генерировать исходный код и компилировать его), то CodeSnippetStatement не сработает.

Однако существуют сторонние инструменты, которые можно использовать для анализа исходного кода C#. В одном проекте, над которым я работал, мы использовали библиотеку NRefactory (которая используется в SharpDevelop), и это сработало достаточно хорошо. Это дает вам некоторое дерево (AST), представляющее проанализированный код, и я боюсь, что вам нужно будет преобразовать его в соответствующее дерево CodeDOM самостоятельно.

person Tomas Petricek    schedule 16.03.2010

Я нашел реализацию библиотеки здесь, которая, кажется, покрывает практически все, что мне нужно. для моих целей. Я не знаю, достаточно ли он надежен для использования в бизнес-сценариях, но для моих модульных тестов это практически все, о чем я могу просить.

person Tomas Vana    schedule 17.03.2010