Как сгенерировать выражение Roslyn TypeExpression для типа, который еще не был сгенерирован?

У меня проблема с курицей и яйцом. Я использую SyntaxGenerator для создания некоторых классов. Некоторые из этих классов будут иметь поля и свойства, типы которых являются типами, созданными в других классах. Итак, мой вопрос: как вы можете объявить поле в классе, у которого есть тип, определенный в другом сгенерированном классе, который еще не был сгенерирован? Должен ли я сначала сгенерировать и скомпилировать все классы, от которых в первую очередь зависит сгенерированный класс?

    foreach (var attribute in datatype.Attributes)
    {
        var fieldName = $"_{MessageNode.FormatResourceName(attribute.Name)}";
        var fieldNode = Generator.FieldDeclaration(fieldName, Generator.TypeExpression(**???**), Accessibility.Private);
    }

Спасибо


person Casey Chester    schedule 03.11.2017    source источник


Ответы (1)


Вы можете сгенерировать любое имя типа, которое вам нравится, независимо от того, существует он или нет, используя SyntaxFactory.

using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Simplification;

var name = SyntaxFactory
    .ParseTypeName("My.Generated.Type")
    .WithAdditionalAnnotations(Simplifier.Annotation);

В качестве альтернативы для простого имени вы можете использовать SyntaxFactory.IdentifierName, для общего имени вы можете использовать SyntaxFactory.GenericName. Эквивалентные API существуют также для создания Visual Basic.

person Kris Vandermotten    schedule 04.11.2017