假设我在代码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不错的方式现在更好 –