假設我在代碼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()
。做
有時候,最好的方法是去外面,並採取新鮮的空氣:)
是的,OP需要語義模型。但是他需要調用本身的GetSymbolInfo,然後從IMethodSymbol獲取第一個類型參數。由於格式不正確,我認爲這個問題並不清楚,但我現在修復了這個問題。 –
非常感謝,我沒有認識到問題的初衷。我相應地調整了代碼。 – SJP
@SJP不錯的方式現在更好 –