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

问题描述 投票:0回答:3

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

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

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

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

c# .net code-injection
3个回答
0
投票

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

对于我的base class libraries,我最终使用dedicating an assembly for utils在我在生产代码中编写的T4代码中使用。我在诸如推出IO代码中的原语的读/写(例如,.TT.CS)之类的地方使用它。如果您不需要太多/复杂的编译时代码,则不必执行此操作。


0
投票

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

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

它像一个魅力:)

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


0
投票

这是一种获得你想要的东西的方式。

使用implicit operators

那需要创建自己的json对象类,然后添加以下内容:

class JsonObject {
    public object obj;

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

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

© www.soinside.com 2019 - 2024. All rights reserved.