为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
人到中年有点甜 2022-01-09 10:53:14
我正在寻找一种在编译时扩展/注入代码的方法,例如模板/宏/片段......假设我在应用程序的很多地方都编写了这段代码:[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 但我想完全像它被写的那样扩展它在同一个类中,可以访问所有类内部。它与代码片段完全相同,但要在编译阶段进行扩展。
查看完整描述

3 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

无需任何额外费用且在 Visual Studio 中受支持的解决方案是T4 aka Text Templates。但是,它确实需要您安装您使用的 VS 版本的 VS SDK(例如2015)和 Modeling SDK(例如2015)。

对于我的基类库,我最终专门为 utils 提供了一个程序集,用于我在生产代码中编写的 T4 代码。我在诸如为 IO 代码(例如.TT.CS)中的基元推出读/写之类的地方使用它。尽管如果您不需要太多/复杂的编译时代码生成,则不必这样做。


查看完整回答
反对 回复 2022-01-09
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

这是一种得到你想要的东西的方法。


使用隐式运算符


例如,这需要创建您自己的 json 对象类,然后添加这些:


class JsonObject {

    public object obj;


    public static implicit operator string(JsonObject target) { 

        return Json.SerializeObject(target.obj);

    }

}

但这不会真正做到你真正想要的。几乎与创建新类并添加函数相同。


查看完整回答
反对 回复 2022-01-09
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

我能够通过编写一个 BeforeBuild msbuild 目标来调用我开发的外部控制台应用程序来实现我的要求:

  1. 将要重写的源文件复制到临时文件夹

  2. 重写临时文件中的源代码

  3. 向 .csproj 文件添加了条件编译标记,以包含操纵的源文件而不是原始文件

它就像一个魅力:)

我正在为这个任务开发一个通用引擎,一旦完成就会将它提交给 github。


查看完整回答
反对 回复 2022-01-09
  • 3 回答
  • 0 关注
  • 288 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号