Проверка цепочки конструкторов через Roslyn

Скажем, у меня есть базовый класс B и производный класс EB. Как я могу проверить, какой базовый конструктор вызывает каждый конструктор EB?

Можно ли это сделать с помощью семантической модели?

Код, иллюстрирующий мою попытку, выглядит следующим образом:

var typeSymbol = semanticModel.GetDeclaredSymbol(classDeclarationSyntax);
IMethodSymbol ctor1 = typeSymbol.Constructors[0];
IMethodSymbol ctor2 = typeSymbol.Constructors[1];

Я не могу отследить какой-либо публичный интерфейс (например, IConstructorSymbol), поэтому я могу преобразовать ctor0 и ctor1 в него.


person user3284063    schedule 24.10.2017    source источник
comment
Это не часть метаданных; вам нужен исходник.   -  person SLaks    schedule 24.10.2017
comment
Хорошо, я каким-то образом обошел ограничение, вернувшись к синтаксису, затем снова к семантике, затем снова к синтаксису и т. д., пока не будет достигнут верхний конструктор. Теперь мой вопрос: почему семантика не хранит такую ​​​​информацию (цепочка конструкторов). Разве не в этом смысл семантической модели?   -  person user3284063    schedule 24.10.2017


Ответы (1)


Семантическая модель связана с метаданными (классами и их элементами), а не с потоком управления/реализацией в реальном коде.

Вот почему можно получить семантическую модель для сборок, на которые ссылаются (даже несмотря на то, что Roslyn не является декомпилятором).

IOW, семантическая модель соответствует тому, что вы видите в обозревателе объектов.

Вам нужно использовать синтаксическое дерево, чтобы увидеть содержимое конструктора.

person SLaks    schedule 24.10.2017