簡體   English   中英

從 roslyn 中的符號獲取類型

[英]Getting type from a symbol in roslyn

從 Microsoft.CodeAnalysis.ISymbol 為不同類型的符號獲取 System.Type 的最佳通用方法是什么? (例如類聲明、變量、屬性等)

我希望能夠對類型進行各種檢查,例如檢查該類型是否實現了任何接口或可強制轉換為任何接口,就像可以檢查 System.Type 一樣。

我遇到的問題是大多數用於表示符號的具體類都是內部的(請參閱http://sourceroslyn.io/ ),並且我在 ISymbol 中找不到 tye 類型信息。

  • 源命名類型符號
  • 本地符號

我使用以下代碼檢索 ISymbol

var objectSymbol = (ISymbol)model.GetDeclaredSymbol(obj.Node);

簡短的回答:你不能。 沒有從ISymbol (Roslyn) 獲取System.Type (反射)的正確方法。

朝着您想要的方向前進的一種選擇是構建您的類型的完全限定名稱,然后通過反射進行查找( 示例)。

您或許應該先問問自己,這是否是您首先需要做的事情——reflection 和 Roslyn 並不是真的打算一起工作。

但是,您感興趣的內容也可以通過 Roslyn 完成。 這里的關鍵是使用為您提供所有這些信息的語義模型。 所有聲明(與用法相反)都有一個特定的重載可用,它允許您獲取聲明符號並以適當的類型返回它(例如本例中的INamedTypeSymbol )。

以下面的例子為例:

const string source = @"
using System;

namespace MyNamespace 
{
    class MyClass : IDisposable
    {
        void Method()
        {
            MyClass nameOfVariable, another;
        }
    }
}
";
var tree = CSharpSyntaxTree.ParseText(source);
var compilation = CSharpCompilation.Create("MyCompilation", new[] { tree }, new[] { MetadataReference.CreateFromFile(typeof(object).Assembly.Location) });
var semanticModel = compilation.GetSemanticModel(tree);
var root = tree.GetRoot();

var classSymbol = semanticModel.GetDeclaredSymbol(root.DescendantNodes().OfType<ClassDeclarationSyntax>().First());
Console.WriteLine(string.Join(", ", classSymbol.AllInterfaces));

這將顯示該類實現的所有接口。 但是請記住,這僅指當前定義——如果您也對基本類型感興趣,則必須自己瀏覽層次結構。

在您的場景中,您應該能夠將其轉換為正確的類型(假設您正在檢查聲明節點):

var objectSymbol = (INamedTypeSymbol) model.GetDeclaredSymbol(obj.Node);

我認為這就是你要找的:

var castedProperty = (IPropertySymbol) property;
var type = castedProperty.Type.Name;

變量 'property' 是一個 ISymbol 實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM