Я пытаюсь создать генератор исходного кода для какой-то цели автоматизации. Моими целевыми типами являются некоторые классы, которые реализуют неизвестные интерфейсы. Эти интерфейсы украшены пользовательским атрибутом. Путем поиска везде я могу найти только образцы, в которых люди имеют атрибуты непосредственно в целевом типе, что, к сожалению, не работает в этом случае.
Вот этот пример целевого кода:
public sealed class SomeAttribute : Attribute
{
}
[Some]
public interface IA
{
}
internal sealed class A : IA
{
}
Но в генераторе исходного кода ClassDeclarationSyntax
, похоже, не предоставляет интерфейсы, вместо этого я могу получить только атрибуты. Этот ответ, приведенный здесь Roslyn CSharpSyntaxRewriter Get A List of Implemented Interfaces, говорит, что мы можем сделать следующее:
var root = classDeclarationSyntax.SyntaxTree.GetRoot();
var model = compilation.GetSemanticModel(root.SyntaxTree);
ISymbol? symbol = model.GetDeclaredSymbol(root.DescendantNodes().OfType<ClassDeclarationSyntax>().First())
var implementedInterfaces = symbol.AllInterfaces;
Но у меня это не работает, так как symbol
не содержит свойства AllInterfaces
. Мой вопрос, как я могу получить список интерфейсов от ClassDeclarationSyntax
?
догадаться. Нам нужно преобразовать symbol
в ITypeSymbol
, как показано ниже:
var interfaces = ((ITypeSymbol)symbol).AllInterfaces