获取类的命名空间

时间:2016-06-24 10:26:23

标签: c# roslyn roslyn-code-analysis

enter image description here你可以帮我找一下 VariableDeclarationSyntax StatementSyntax IdentifierNameSyntax 的命名空间吗?

我只是使用下面的代码,但它总是只回复“Microsoft.CodeAnalysis.CSharp.Syntax”命名空间。

string namespaceName = identifierSyntax.GetType()。BaseType.Namespace;

请考虑以下示例:

Package X;

Class A {};

Class B
{
A a;
}

这两个类都可以在包X中找到;所以我不想在B中引用A类的命名空间,如果我在B类中使用A的实例。 但我想要A类的命名空间名称 使用Roslyn。有没有办法得到它?

1 个答案:

答案 0 :(得分:0)

从IdentifierNameSyntax,如果要确定在其中声明标识符的名称空间,那么您可以执行以下操作(因此您可以从其他节点类型执行相同操作) -

var ns = context.Node.Ancestors().OfType<NamespaceDeclarationSyntax>().FirstOrDefault();

请注意,这有时会为空。例如,如果您要分析以下内容

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class TypeName
    {   
    }
}

然后&#34; System&#34;,&#34; Collections&#34;,&#34; Generic&#34;等...将导致IdentifierNameSyntax的实例,但它们不在命名空间内。

另外,如果你有一个VariableDeclarationSyntax并且你想知道哪个命名空间包含变量所属的类型,那么你可以这样做:

var variableDeclaration = (VariableDeclarationSyntax)context.Node;
var type = context.SemanticModel.GetTypeInfo(variableDeclaration.Type).Type;
if ((type != null) && !(type is IErrorTypeSymbol)) // This will happen if the type lookup fails
{
    var ns = type.ContainingNamespace;
}

如果您正在分析该行

var x = new SqlCommand();
然后&#34;输入&#34;将是&#34; System.Data.SqlClient.SqlCommand&#34;所以&#34; ns&#34;将是命名空间&#34; System.Data.SqlClient&#34 ;;