如何在 .NET Roslyn API 中获取其他继承 class 的继承 class 的值?
How can I get the value of inheritance class of other inheritance class in .NET Roslyn API?
美好的一天,
我一直在尝试在 Roslyn API.
中获取继承 class 其他继承 class 的名称的值
如下图,
当我扫描 'Face' class 时,我想获取“人类”的名字。
像这样的结构,我可以通过使用ClassDeclaration.BaseList得到第一个继承class的名字。我可以从 Face class!
中得到“头”的名字
但是我无法访问第二个继承class(人类class)。我认为 Face class.
中没有更多的树结构
问题是如果 classes 是分开的,如何获得 2 层上层(或更多)继承 class 名称。
谢谢。
获取树的语义模型,然后使用 ClassDeclarationSyntax 调用 GetDeclaredSymbol()。这将为您提供 ITypeSymbol,您可以从那里查看 BaseType。你不想仅仅因为部分 类.
就用语法来尝试这个
在 SyntaxNode 的 BaseList 属性 上创建一个递归函数。像这样的东西
private static bool IsDrivedFromHead(ClassDeclarationSyntax syntax)
{
if (syntax.BaseList == null)
return false;
if (!syntax.BaseList.Types.Any(a => a.Type.ToString() == "Namespace.Head"))
{
bool IsDrived = false;
foreach (var baseType in syntax.BaseList.Types)
{
var node = (CompilationUnitSyntax)baseType.SyntaxTree.GetRoot();
foreach (ClassDeclarationSyntax member in node.Members.Where(w=> w is ClassDeclarationSyntax))
{
IsDrived = IsInheritFromHead(member);
if (IsDrived)
break;
}
if (IsDrived)
break;
}
return IsDrived;
}
else
return true;
}
美好的一天, 我一直在尝试在 Roslyn API.
中获取继承 class 其他继承 class 的名称的值如下图,
当我扫描 'Face' class 时,我想获取“人类”的名字。 像这样的结构,我可以通过使用ClassDeclaration.BaseList得到第一个继承class的名字。我可以从 Face class!
中得到“头”的名字但是我无法访问第二个继承class(人类class)。我认为 Face class.
中没有更多的树结构问题是如果 classes 是分开的,如何获得 2 层上层(或更多)继承 class 名称。
谢谢。
获取树的语义模型,然后使用 ClassDeclarationSyntax 调用 GetDeclaredSymbol()。这将为您提供 ITypeSymbol,您可以从那里查看 BaseType。你不想仅仅因为部分 类.
就用语法来尝试这个在 SyntaxNode 的 BaseList 属性 上创建一个递归函数。像这样的东西
private static bool IsDrivedFromHead(ClassDeclarationSyntax syntax)
{
if (syntax.BaseList == null)
return false;
if (!syntax.BaseList.Types.Any(a => a.Type.ToString() == "Namespace.Head"))
{
bool IsDrived = false;
foreach (var baseType in syntax.BaseList.Types)
{
var node = (CompilationUnitSyntax)baseType.SyntaxTree.GetRoot();
foreach (ClassDeclarationSyntax member in node.Members.Where(w=> w is ClassDeclarationSyntax))
{
IsDrived = IsInheritFromHead(member);
if (IsDrived)
break;
}
if (IsDrived)
break;
}
return IsDrived;
}
else
return true;
}