c# – 从Roslyn ClassDeclarationSyntax获取类FullName(包括命名空间)

前端之家收集整理的这篇文章主要介绍了c# – 从Roslyn ClassDeclarationSyntax获取类FullName(包括命名空间)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在roslyn中的语法树中有一个ClassDeclarationSyntax.
我这样读:
var tree = SyntaxTree.ParseText(sourceCode);
var root = (CompilationUnitSyntax)tree.GetRoot();

var classes = root.DescendantNodes().OfType<ClassDeclarationSyntax>();

该标识符仅包含类的名称,但不包含有关名称空间的信息,因此缺少fullType名称.喜欢“MyClass”但noch“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 = namespace.Name + "." + 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#相关文章