编译时的 C# 代码扩展/注入

我正在寻找一种在编译时扩展/注入代码的方法,例如模板/宏/片段......


假设我在应用程序的很多地方都编写了这段代码:


[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 但我想完全像它被写的那样扩展它在同一个类中,可以访问所有类内部。


它与代码片段完全相同,但要在编译阶段进行扩展。


人到中年有点甜
浏览 289回答 3
3回答

Smart猫小萌

无需任何额外费用且在 Visual Studio 中受支持的解决方案是T4 aka Text Templates。但是,它确实需要您安装您使用的 VS 版本的 VS SDK(例如2015)和 Modeling SDK(例如2015)。对于我的基类库,我最终专门为 utils 提供了一个程序集,用于我在生产代码中编写的 T4 代码。我在诸如为 IO 代码(例如.TT和.CS)中的基元推出读/写之类的地方使用它。尽管如果您不需要太多/复杂的编译时代码生成,则不必这样做。

斯蒂芬大帝

这是一种得到你想要的东西的方法。使用隐式运算符例如,这需要创建您自己的 json 对象类,然后添加这些:class JsonObject {    public object obj;    public static implicit operator string(JsonObject target) {         return Json.SerializeObject(target.obj);    }}但这不会真正做到你真正想要的。几乎与创建新类并添加函数相同。

蝴蝶刀刀

我能够通过编写一个 BeforeBuild msbuild 目标来调用我开发的外部控制台应用程序来实现我的要求:将要重写的源文件复制到临时文件夹重写临时文件中的源代码向 .csproj 文件添加了条件编译标记,以包含操纵的源文件而不是原始文件它就像一个魅力:)我正在为这个任务开发一个通用引擎,一旦完成就会将它提交给 github。
打开App,查看更多内容
随时随地看视频慕课网APP