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