我有一个来自 roslyn 语法树的 ClassDeclarationSyntax。 我是这样读的:
var tree = SyntaxTree.ParseText(sourceCode);
var root = (CompilationUnitSyntax)tree.GetRoot();
var classes = root.DescendantNodes().OfType<ClassDeclarationSyntax>();
标识符只包含类的名称,但没有有关命名空间的信息,因此缺少完整的类型名称。喜欢“MyClass”但没有“Namespace1.MyClass”
获取语法的命名空间/FulltypeName 的推荐方法是什么?
最佳答案
你可以使用我写的帮助类来做到这一点:
NamespaceDeclarationSyntax namespaceDeclarationSyntax = null;
if (!SyntaxNodeHelper.TryGetParentSyntax(classDeclarationSyntax, out namespaceDeclarationSyntax))
{
return; // or whatever you want to do in this scenario
}
var namespaceName = namespaceDeclarationSyntax.Name.ToString();
var fullClassName = namespaceName + "." + classDeclarationSyntax.Identifier.ToString();
和助手:
static class SyntaxNodeHelper
{
public static bool TryGetParentSyntax<T>(SyntaxNode syntaxNode, out T result)
where T : SyntaxNode
{
// set defaults
result = null;
if (syntaxNode == null)
{
return false;
}
try
{
syntaxNode = syntaxNode.Parent;
if (syntaxNode == null)
{
return false;
}
if (syntaxNode.GetType() == typeof (T))
{
result = syntaxNode as T;
return true;
}
return TryGetParentSyntax<T>(syntaxNode, out result);
}
catch
{
return false;
}
}
}
这里没有什么太复杂的事情……命名空间将在语法树上“向上”是有道理的(因为类包含在命名空间中)所以您只需要在语法树上“向上”移动直到找到命名空间并将其附加到 ClassDeclarationSyntax
的标识符。
关于c# - 从 Roslyn ClassDeclarationSyntax 获取类全名(包括命名空间),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20458457/