2017-08-10 47 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不錯的方式現在更好 –

相關問題