簡體   English   中英

如何在不編譯項目的情況下獲取類的元數據

[英]How to get metadata of classes without compiling the project

在我們的項目中,我們使用了大量的T4代碼生成。 我們使用一個名為DataObjects.Net的X-Tensive ORM。 我們有點雞蛋問題。 在我們使用程序集的元數據生成代碼之前,我們需要編譯ORM的類。 然后,當生成代碼時,我們可以再次編譯模型,但現在與生成的代碼(部分類)組合。 如果沒有生成的代碼,則無法編譯模型類中的大多數自定義代碼。

我們如何解決它是在VS2013中有一個名為“模型”的單獨配置。 在此配置中,存在“條件編譯符號”調用“JUSTMODEL”。 在沒有生成代碼的情況下不編譯的所有代碼都放在#if!JUSTMODEL #endif編譯器指令之間,這導致不為“模型”配置編譯此代碼。

這有點單調乏味。 我們已經創建了一個可擴展的應用程序來自動執行此過程,但運行過程會越來越耗費時間。

現在我想知道是否有可能獲得Model程序集的元數據而不通過某種擴展性API構建程序集。 我在Visual Studio中看到很多工具,它們理解編輯器中加載的類並給我一些反饋(比如intellisense)。

有比NRefactor更好的方法。 我在Visual Studio中發現了CodeModel。 它為我提供了生成代碼所需的所有元數據。 你可以在這里找到很多關於如何在網上實現這一點的細節:

  1. 微軟
  2. 有形

和許多其他地方。 由於數據的動態特性,編碼與C#有點不同,但當你掌握它時,它非常容易且非常強大。

我會考慮使用NRefactory庫或類似的。 NRefactory的想法與Roslyn類似,所以應該解決你的問題。 如果我理解正確,您需要在編譯之前獲得有關課程及其成員的信息。 基於NRefactory的最簡單的代碼,負責檢索類的列表以及有關方法和屬性的信息,可以通過以下方式查找:

var parser = new CSharpParser();
var syntaxTree = parser.Parse(code);

var classes = syntaxTree.Descendants.OfType<TypeDeclaration>().Where(x => x.ClassType == ClassType.Class);
foreach (var typeDeclaration in classes)
{
    var result = typeDeclaration.Descendants.Where(d => d is MethodDeclaration || d is PropertyDeclaration);
    foreach (var declaration in result )
    {
        //...
    }
}

此示例僅執行源代碼的語法分析。 但是,您也可以使用CSharpAstResolver類使用NRefactory執行語義分析。

暫無
暫無

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

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