[英]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.