你可以帮我找一下 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。有没有办法得到它?
答案 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 ;;