Данный класс является абстрактным и наследуется от [[CSharpSyntaxNode]]. У класса `TypeSyntax` нет собственных полей, методов или свойств, которые были бы уникальными только для него. `TypeSyntax` — это базовый класс в Roslyn, представляющий узел синтаксического дерева, связанный с типами в языке C#. Это абстрактный класс, от которого наследуются различные конкретные типы синтаксиса, описывающие типы данных. ### Как получить агрументы дженерика Больше об этом читайте тут: [[GenericNameSyntax]] ```csharp var variableType = field.Declaration.Type; // Проверяем, является ли тип дженериком if (variableType is GenericNameSyntax genericName) { // Имя дженерика Console.WriteLine(quot;Generic Name: {genericName.Identifier}"); // Аргументы дженерика foreach (var argument in genericName.TypeArgumentList.Arguments) { Console.WriteLine(quot;Type Argument: {argument}"); } } ``` ### Основные производные классы `TypeSyntax`: 1. **`PredefinedTypeSyntax`** Представляет встроенные примитивные типы, такие как `int`, `bool`, `void`, и другие стандартные типы C#. Пример: ```csharp int x; ``` Узел типа `int` будет представлен как `PredefinedTypeSyntax`. 2. **`IdentifierNameSyntax`** Представляет использование простого имени типа. Обычно это имя пользовательского типа или тип, объявленный в другом месте. Пример: ```csharp MyClass x; ``` Здесь `MyClass` — это `IdentifierNameSyntax`. 3. **`GenericNameSyntax`** Представляет дженерик тип (тип с параметрами типов), например, `List<int>`. Пример: ```csharp List<int> list; ``` Узел `List<int>` будет представлен как `GenericNameSyntax`. 4. [[ArrayTypeSyntax]] Представляет массивы. Например, `int[]` или `string[][]` — это типы массивов. Пример: ```csharp int[] array; ``` Узел типа `int[]` будет представлен как `ArrayTypeSyntax`. 5. **`QualifiedNameSyntax`** Представляет составные (квалифицированные) имена типов, такие как имена, состоящие из нескольких частей, разделённых точками. Например, `System.Collections.Generic.List`. Пример: ```csharp System.Collections.Generic.List<int> list; ``` Здесь `System.Collections.Generic.List` — это `QualifiedNameSyntax`. 6. **`NullableTypeSyntax`** Представляет nullable-типы, например, `int?`. Пример: ```csharp int? nullableInt; ``` Узел типа `int?` будет представлен как `NullableTypeSyntax`. 7. **`PointerTypeSyntax`** Представляет указатели, например, `int*`. Пример: ```csharp int* pointer; ``` Узел типа `int*` будет представлен как `PointerTypeSyntax`. 8. **`TupleTypeSyntax`** Представляет кортежи, такие как `(int, string)`. Пример: ```csharp (int, string) tuple; ``` Узел типа кортежа будет представлен как `TupleTypeSyntax`. ### Использование `TypeSyntax` В Roslyn `TypeSyntax` является универсальной точкой для представления любых типов в коде C#. Работая с синтаксическим деревом, вы часто будете сталкиваться с производными классами `TypeSyntax`, чтобы получить информацию о типах переменных, возвращаемых значений методов, аргументах типов и других местах, где типы упоминаются в коде. ### Пример обработки различных типов через `TypeSyntax`: ```csharp using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using System; using System.Linq; class Program { static void Main() { var code = @" class MyClass { int a; List<int> list; System.Collections.Generic.List<int> qualifiedList; int[] array; (int, string) tuple; int? nullableInt; }"; var tree = CSharpSyntaxTree.ParseText(code); var root = tree.GetRoot(); var fields = root.DescendantNodes().OfType<FieldDeclarationSyntax>(); foreach (var field in fields) { var type = field.Declaration.Type; if (type is PredefinedTypeSyntax predefinedType) { Console.WriteLine(quot;Predefined type: {predefinedType}"); } else if (type is GenericNameSyntax genericName) { Console.WriteLine(quot;Generic type: {genericName.Identifier}"); } else if (type is QualifiedNameSyntax qualifiedName) { Console.WriteLine(quot;Qualified type: {qualifiedName}"); } else if (type is ArrayTypeSyntax arrayType) { Console.WriteLine(quot;Array type: {arrayType}"); } else if (type is TupleTypeSyntax tupleType) { Console.WriteLine(quot;Tuple type: {tupleType}"); } else if (type is NullableTypeSyntax nullableType) { Console.WriteLine(quot;Nullable type: {nullableType}"); } } } } ``` В этом примере код обрабатывает различные виды типов (примитивы, массивы, дженерики, nullable-типы и кортежи) и выводит соответствующую информацию. ### Итог `TypeSyntax` и его производные классы позволяют работать с любыми типами данных в исходном коде C#. С помощью этой модели вы можете извлекать и анализировать информацию о типах, объявленных в коде, и использовать её для различных целей, таких как статический анализ или генерация кода.