コード内に、InvocationExpressionSyntaxであるSomeClass.SomeStaticMethod<T>()
という呼び出しがあるとします。C#Roslynコンパイラ - IdentifierNameSyntaxから型の名前空間を取得するには?
一般的なタイプTの名前は(IdentifierNameSyntaxの)文字列として取得されます。私はTのシンボルを取得しようとしましたが、成功しませんでした。
タイプTの名前空間情報を調べるにはどうすればよいですか?
UPDATE:@SJPの回答は正しいです。
私の最初の目的はSomeClass.SomeMethod<T>()
形式で呼び出しを見つけることだったと型の名前空間情報を取得する:私は、クラス(クラス名)のための識別子が含まれているIdentifierNameSyntax、から名前空間情報を取得したい人のために私のミスを説明したいですここでは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良い方法いい加減今 –