2017-08-10 24 views
1

コード内に、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()のように行われることがわかりました。時々行うための最善のことは、外に行くと新鮮な空気を取っている

:)

答えて

2

あなたはあなたのタスクを達成するために、セマンティックモデルが必要になるだろう。あなたは工assの名前空間を必要とすると仮定すると、以下のように、あなたはちょうど式の名前のフィールドにアクセスすることによって、そこから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; 

を、これはつながります変数nameSpaceNameの "System"または "ConsoleApp1"(呼び出しに応じて)で、他のすべての情報は変数nameSpaceでアクセスできます。

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良い方法いい加減今 –

関連する問題