我在roslyn中的语法树中有一个ClassDeclarationSyntax.
我这样读:
我这样读:
var tree = SyntaxTree.ParseText(sourceCode); var root = (CompilationUnitSyntax)tree.GetRoot(); var classes = root.DescendantNodes().OfType<ClassDeclarationSyntax>();
该标识符仅包含类的名称,但不包含有关名称空间的信息,因此缺少fullType名称.喜欢“MyClass”但noch“Namespace1.MyClass”
解决方法
你可以使用我写的帮助类:
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的标识符.