4

Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax から System.Type または本質的に完全修飾型名を取得できますか? 問題は、TypeSyntax が、完全に修飾されたクラス名ではない可能性があるコードで記述された型の名前を返すことです。そこから Type を見つけることができません。

4

1 に答える 1

7

構文の完全修飾名を取得するには、 を使用しSemanticModelてそのシンボルにアクセスする必要があります。私のブログにセマンティック モデルのガイドを書きました: Roslyn を今すぐ学ぶ: セマンティック モデルの紹介

前の質問に基づいて、フィールドを見ていると思います。

var tree = CSharpSyntaxTree.ParseText(@"
class MyClass
{
    int firstVariable, secondVariable;
    string thirdVariable;
}");

var mscorlib = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);
var compilation = CSharpCompilation.Create("MyCompilation",
    syntaxTrees: new[] { tree }, references: new[] { mscorlib });

//Get the semantic model
//You can also get it from Documents
var model = compilation.GetSemanticModel(tree);

var fields = tree.GetRoot().DescendantNodes().OfType<FieldDeclarationSyntax>();
var declarations = fields.Select(n => n.Declaration.Type);
foreach (var type in declarations)
{
    var typeSymbol = model.GetSymbolInfo(type).Symbol as INamedTypeSymbol;
    var fullName = typeSymbol.ToString();
    //Some types like int are special:
    var specialType = typeSymbol.SpecialType;
}

次の方法で、(宣言の型ではなく) 宣言自体のシンボルを取得することもできます。

var declaredVariables = fields.SelectMany(n => n.Declaration.Variables);
foreach (var variable in declaredVariables)
{
    var symbol = model.GetDeclaredSymbol(variable);
    var symbolFullName = symbol.ToString();
}

最後に 1 つ: これらのシンボルを呼び出す.ToString()と、完全修飾名が得られますが、完全修飾メタデータ名は得られません。(ネストされたクラスは+クラス名の前にあり、ジェネリックは異なる方法で処理されます)。

于 2015-10-29T18:30:53.860 に答える