簡體   English   中英

使用 Roslyn 確定類是否為記錄

[英]Determine whether class is a record using Roslyn

我正在編寫一個源代碼生成器,需要知道我使用 Microsoft.CodeAnalysis 向其添加功能的類是否是記錄。

我可以通過切換到語法模型來做到這一點,如下所示:

public static bool IsRecord(this ITypeSymbol type)
{
    if (type == null || type.TypeKind != TypeKind.Class)
        return false;
    bool isRecord = (type.DeclaringSyntaxReferences.Any(x => (x.SyntaxTree.GetRoot().FindNode(x.Span) is RecordDeclarationSyntax)));
    return isRecord;
}

但是有沒有辦法用語義模型來做到這一點? 我很可能遺漏了一些明顯的東西,但我已經檢查了在我看來是明顯的地方,並且我還在 github 上進行了搜索。 Roslyn 內部似乎有一個IsRecord ,但我找不到任何公開的內容。 如果我無法在語義模型中訪問它,即使該類型來自從另一個程序集導入的代碼,上述內容是否也能正常工作?

從 Roslyn API 的 3.9.0-2.final 版本(這對應於 Visual Studio 16.9 預覽版 2)開始,ITypeSymbol 現在具有您可以使用的 IsRecord 屬性。

似乎沒有任何官方公共財產 IsRecord。 因此,我們需要尋找記錄將包含的內容,例如隱式聲明的名為“EqualityContract”的屬性:

type.GetMembers().Any(x => x.Kind == SymbolKind.Property && x.Name == "EqualityContract" && x.IsImplicitlyDeclared)

暫無
暫無

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

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