簡體   English   中英

編譯時進行C#代碼擴展/注入

[英]C# code expansion/injection in compile time

我正在尋找一種在編譯時擴展/注入代碼的方法,例如模板/宏/代碼段...

假設我在應用程序的很多地方都編寫了以下代碼:

[JsonObject("MyProperty")]
private string MyPropertyJson { get; set; }
public object MyProperty { get; set; }

MyPropertyJson屬性僅用於EF映射,因此我將值保存為DB中的JSON字符串,但對於類用戶,他們僅了解MyProperty屬性。

我想做的是在編譯時將MyPropertyJson擴展為:

private string MyPropertyJson 
{
    get
    {
        return JsonConvert.SerializeObject(MyProperty);
    }
    set
    {
        MyProperty = JsonConvert.DeserializeObject(value);
    }
}

我希望僅在輸出二進制文件中完成此操作而不影響源代碼。

我了解Unity,PostSharp,Aspect-Injector等。但是它們無法實現我想要的功能,因為通過使用它們,我必須使用一些反射來查找和操作MyProperty,但我想像編寫它一樣完全擴展它在同一個班級中,可以訪問所有班級內部信息。

就像代碼片段一樣,但是要在編譯階段進行擴展。

T4 aka文本模板是一種無需任何額外費用且在Visual Studio中受支持的解決方案。 但是,這確實需要您安裝所使用的VS版本的VS SDK(例如2015 )和Modeling SDK(例如2015 )。

對於我的基類庫 ,我最終將專用於utils 的程序集用於在生產代碼中編寫的T4代碼中使用。 我在諸如IO代碼(例如.TT.CS )的基元展開讀/寫操作的地方使用它。 盡管如果不需要太多/復雜的編譯時代碼生成,則不必這樣做。

通過編寫BeforeBuild msbuild目標來調用我開發來的外部控制台應用程序,我能夠達到我的要求:

  1. 將要重寫的源文件復制到臨時文件夾
  2. 重寫臨時文件中的源代碼
  3. 在.csproj文件中添加了條件Compile標簽,以包含經過處理的源文件,而不是原始文件。

它就像一個魅力:)

我正在為此任務使用通用引擎,完成后將其提交到github。

這是一種獲得所需內容的方法。

使用隱式運算符

例如,需要創建自己的json對象類,然后添加以下內容:

class JsonObject {
    public object obj;

    public static implicit operator string(JsonObject target) { 
        return Json.SerializeObject(target.obj);
    }
}

但這並不能真正做到您真正想要的。 幾乎與創建新類和添加函數相同。

暫無
暫無

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

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