【问题标题】:C# code expansion/injection in compile time编译时的 C# 代码扩展/注入
【发布时间】:2018-09-08 05:54:40
【问题描述】:

我正在寻找一种在编译时扩展/注入代码的方法, 类似模板/宏/sn-ps...

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

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

它与代码 sn-ps 完全相同,但在编译阶段需要扩展。

【问题讨论】:

  • 您的用例是什么?您想在 json 中存储的日期是否不同?只是为了更好地了解可能的解决方案..
  • 这对很多可能性都是开放的,实际上不是专门的 json 示例 :) 它是很多东西的通用解决方案,例如 - 横切关注点(日志记录、异常处理等)。 )这将是一种以纯粹的方式(对我而言)没有运行时编织器或使用反射的代码冗余解决方案。没有具体的场景,因为我正在尝试为这个代码注入任务构建一个通用引擎,以便分布在许多团队中。
  • 我也一直在研究通用解决方案,我还没有遇到这种可能性。

标签: c# .net code-injection


【解决方案1】:

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

对于我的 base class libraries,我最终选择了 dedicating an assembly 供 utils 用于我在生产代码中编写的 T4 代码。我在诸如推出 IO 代码中的基元的读/写之类的地方使用它(例如,.TT.CS)。尽管如果您不需要太多/复杂的编译时代码生成,则不必这样做。

【讨论】:

    【解决方案2】:

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

    1. 将要重写的源文件复制到临时文件夹
    2. 重写临时文件中的源代码
    3. 在 .csproj 文件中添加了条件编译标记,以包含操纵的源文件而不是原始文件

    它就像一个魅力:)

    我正在为此任务开发一个通用引擎,一旦完成,我会将其提交到 github。

    【讨论】:

      【解决方案3】:

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

      使用implicit operators

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

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

      但这并不能真正做到你真正想要的。几乎和创建一个新类并添加函数一样。

      【讨论】:

        猜你喜欢
        • 2010-10-02
        • 1970-01-01
        • 2010-11-24
        • 1970-01-01
        • 1970-01-01
        • 2015-11-11
        • 2016-04-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多