Roslyn 在 {SomeSyntax}.Type 下获取详细信息
Roslyn getting details under {SomeSyntax}.Type
我有一个通用的 class:
public class NestedDict<T>: Dictionary<string, Dictionary<string, T> { }
如图所示,我可以解析和访问它的 BaseList
并找出它的 TypeArgumentList
在调试器中。但是,我不能简单地调用 baseType.Type.TypeArgumentList
来访问它,因为它不是我可以访问的 public 成员。
通常,在我的情况下,访问 Type
下的 TypeArgumentList
的正确方法是什么?或一般的任何类型详细信息?
虽然您可能知道 baseType
是泛型类型(所以是 GenericNameSyntax
),但它不是唯一可能的情况,因此 BaseList
中的对象属于父类输入 (TypeSyntax
).
您只需强制转换即可访问 TypeArgumentList
:
var tree = CSharpSyntaxTree.ParseText("public class NestedDict<T>: Dictionary<string, Dictionary<string, T> { } ");
var cu = (CompilationUnitSyntax)tree.GetRoot();
var c = (ClassDeclarationSyntax)cu.ChildNodes().Single();
var baseDeclaration = (BaseTypeSyntax)c.BaseList.ChildNodes().Single();
var baseNameSyntax = (GenericNameSyntax)baseDeclaration.Type;
Console.WriteLine(baseNameSyntax.TypeArgumentList.Arguments[0].ToFullString());
Console.WriteLine(baseNameSyntax.TypeArgumentList.Arguments[1].ToFullString());
我有一个通用的 class:
public class NestedDict<T>: Dictionary<string, Dictionary<string, T> { }
如图所示,我可以解析和访问它的 BaseList
并找出它的 TypeArgumentList
在调试器中。但是,我不能简单地调用 baseType.Type.TypeArgumentList
来访问它,因为它不是我可以访问的 public 成员。
通常,在我的情况下,访问 Type
下的 TypeArgumentList
的正确方法是什么?或一般的任何类型详细信息?
虽然您可能知道 baseType
是泛型类型(所以是 GenericNameSyntax
),但它不是唯一可能的情况,因此 BaseList
中的对象属于父类输入 (TypeSyntax
).
您只需强制转换即可访问 TypeArgumentList
:
var tree = CSharpSyntaxTree.ParseText("public class NestedDict<T>: Dictionary<string, Dictionary<string, T> { } ");
var cu = (CompilationUnitSyntax)tree.GetRoot();
var c = (ClassDeclarationSyntax)cu.ChildNodes().Single();
var baseDeclaration = (BaseTypeSyntax)c.BaseList.ChildNodes().Single();
var baseNameSyntax = (GenericNameSyntax)baseDeclaration.Type;
Console.WriteLine(baseNameSyntax.TypeArgumentList.Arguments[0].ToFullString());
Console.WriteLine(baseNameSyntax.TypeArgumentList.Arguments[1].ToFullString());