2017-08-10 154 views
1

假设我在代码SomeClass.SomeStaticMethod<T>()中调用了一个InvocationExpressionSyntax。C#Roslyn编译器 - 如何从IdentifierNameSyntax获取类型的名称空间?

我将泛型类型T的名称作为字符串(来自IdentifierNameSyntax)。我试图让T的符号,但我没有成功。

如何找出T型的命名空间信息?

更新:@SJP的答案是正确的。我想解释一下我的错,谁想要摆脱IdentifierNameSyntax,其中包含一个标识一类(类名)命名空间信息:

我最初的目的是找到调用在SomeClass.SomeMethod<T>()格式,并得到类型的命名空间信息T.

var namedTypeSymbol = context.Symbol as INamedTypeSymbol; 
var reference = nameTypeSymbol.DeclaringSyntaxReferences.First(); 
var classSyntaxTree = reference.SyntaxTree; 

var semanticModel = context.Compilation.GetSemanticModel(classSyntaxTree); 
var genericNameSyntax = (GenericNameSyntax)((MemberAccessExpressionSyntax)node.Expression).Name; 
var identifierNameSyntax = genericNameSyntax.TypeArgumentList.Arguments.First(); 
var typeInfo = semanticModel.GetTypeInfo(identifierNameSyntax); 
var nameSpace = ((INamedTypeSymbol)typeInfo.Type).ContainingNamespace; 
var nameSpaceName = nameSpace.ToString(); 

这里是我的错误:

我试图让完整的命名空间像<module_name>.<namespace_part_1>.<namespace_part_2>,但是当我做namedTypeSymbol.ContainingNamespace.Name,我只得到了<namespace_part_2> 。几个小时后,我发现得到完整的命名空间就像namedTypeSymbol.ContainingNamespace.ToString()。做

有时候,最好的方法是去外面,并采取新鲜的空气:)

回答

2

你会需要语义模型来实现你的任务。假设你需要SomeClass的的命名空间,然后你可以只通过访问表达式的名称字段中得到从那里从MemberAccessExpressionSyntax命名空间中的类型和名称如下:

var semanticModel = await document.GetSemanticModelAsync() 
var name = (GenericNameSyntax)((MemberAccessExpressionSyntax)node.Expression).Name; 
var typeInfo = semanticModel.GetTypeInfo(name.TypeArgumentList.Arguments.First()); 
var nameSpace = ((INamedTypeSymbol)typeInfo.Type).ContainingNamespace; 
var nameSpaceName = nameSpace.Name; 

对于下面的示例程序,这将导致在“系统”或“ConsoleApp1”中(取决于调用)变量名称空格,而所有其他信息可以通过变量名称空间访问。

namespace ConsoleApp1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Program.DoStuff<string>(); 
      Program.DoStuff<Program>(); 
     } 

     static void DoStuff<T>() 
     { 

     } 
    } 
} 
+2

是的,OP需要语义模型。但是他需要调用本身的GetSymbolInfo,然后从IMethodSymbol获取第一个类型参数。由于格式不正确,我认为这个问题并不清楚,但我现在修复了这个问题。 –

+0

非常感谢,我没有认识到问题的初衷。我相应地调整了代码。 – SJP

+0

@SJP不错的方式现在更好 –

相关问题