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

标签 c# roslyn

我有一个来自 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/

相关文章:

时间:2019-03-17 标签:c#asp.netWebAPIOwinJsonToken

c# - 正则表达式 : domains separated by semicolon

c# - 如何按角色的排序顺序对员工列表进行排序?

c# - 在同一解决方案中使用 Roslyn 代码分析器

c# - Roslyn 语义模型及其解决方案

c# - 如何在动态按钮上创建动态按钮单击事件?

c# - 如何更改任务管理器中显示的控制台应用程序名称?

c# - params 过载明显的歧义 - 仍然可以编译和工作吗?

c# - 动态编译的项目丢失资源

c# - 如何从头开始构建 Roslyn 语法树?