![](/img/trans.png)
[英]Checking whether the base class implements a certain interface using 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.