Semantik modelde, kodunuzu oluşturan semantiklerle ilgili bilgileri alabilirsiniz (açıkça) - bu, türler ve diğer yapılar hakkında özel bilgi almanızı sağlar.
void Main()
{
var tree = CSharpSyntaxTree.ParseText(@"
using X = System.Text;
using Y = System;
using System.IO;
namespace ConsoleApplication1
{
}"
);
var mscorlib = PortableExecutableReference.CreateFromFile(typeof(object).Assembly.Location);
var compilation = CSharpCompilation.Create("MyCompilation", syntaxTrees: new[] { tree }, references: new[] { mscorlib });
var semanticModel = compilation.GetSemanticModel(tree);
var root = tree.GetRoot();
// Get usings
foreach (var usingDirective in root.DescendantNodes().OfType<UsingDirectiveSyntax>())
{
var symbol = semanticModel.GetSymbolInfo(usingDirective.Name).Symbol;
var name = symbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
name.Dump();
}
}
Çıktı:
küresel :: System.Text
küresel :: Sistem
küresel :: System.IO
Eğer Örneğin
SymbolDisplayFormat.CSharpErrorMessageFormat
kullanın,
alırsınız
System.Text
Sistem
System.IO
ilgilendiğiniz ama gördüğünüz gibi takma adları ile ve olmadan da gayet iyi işe yaradığını Tercih sizin.
Söz konusu türü almak için semanticmodel'i kullanmanız ve sonra da '.ToDisplayString()' kullanarak tam nitelikli adı bulmanız gerekeceğini varsayalım. –
@JeroenVannevel: Bunu bir cevap olarak yazmalısın. ;-) –
@JasonMalinowski Meşgul oldum ama şimdi bir tane ekledim ;-) Belki de SymbolDisplayFormat'ın kullanılması gerektiğini açıklayabilir misin? SymbolDisplayFormat.FullyQualifiedFormat'nın 'global ::' önekini içermesini beklemiyordum –