【发布时间】:2017-08-10 12:21:58
【问题描述】:
假设我在代码中有一个调用,SomeClass.SomeStaticMethod<T>(),它是一个 InvocationExpressionSyntax。
我将泛型类型 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()。
有时最好的办法就是到户外呼吸新鲜空气:)
【问题讨论】:
标签: c# roslyn roslyn-code-analysis