繁体   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