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

y1aodyip  于 11个月前  发布在  .NET
关注(0)|答案(3)|浏览(150)

我正在寻找一种在编译时扩展/注入代码的方法,比如模板/宏/片段。
假设我在应用程序的很多地方都写了这段代码:

[JsonObject("MyProperty")]
private string MyPropertyJson { get; set; }
public object MyProperty { get; set; }

字符串
MyPropertyJson属性仅用于EFMap目的,因此我将值保存为DB中的JSON字符串,但对于类用户,他们只知道MyProperty属性。
我想做的是,在编译时,MyPropertyJson被扩展为:

private string MyPropertyJson 
{
    get
    {
        return JsonConvert.SerializeObject(MyProperty);
    }
    set
    {
        MyProperty = JsonConvert.DeserializeObject(value);
    }
}


我希望在不影响源代码的情况下,只在输出二进制文件中完成此操作。
我知道Unity,PostSharp,Ammon-Injector等,但它们没有达到我想要的效果,因为使用它们,我必须使用一些反射来查找和操作MyProperty,但我想扩展它,就像它在同一个类中编写的那样,可以访问所有类内部。
它完全像代码片段,但在编译阶段被扩展。

iq0todco

iq0todco1#

一个不需要任何额外费用并且在Visual Studio中支持的解决方案是T4 aka Text Templates。但是,它需要您安装您使用的VS版本的VS SDK(例如,2015)和建模SDK(例如,2015)。
对于我的base class libraries,我最终使用dedicating an assembly作为我在生产代码中编写的T4代码中使用的实用程序。我在IO代码中为原语(例如,.TT.CS)推出读/写等地方使用它。如果你不需要太多/复杂的编译时代码生成,你不必这样做。

46scxncf

46scxncf2#

我能够通过编写BeforeBuild msbuild目标来调用外部控制台应用程序来实现我的要求,我已经开发了该应用程序:
1.将将要重写的源文件复制到临时文件夹中
1.重写临时文件中的源代码
1.在.csproj文件中添加了条件编译标记,以包含经过处理的源文件,而不是原始文件
它的工作就像一个魅力:)
我正在为这个任务开发一个通用引擎,一旦完成,我会把它提交到github。

vwhgwdsa

vwhgwdsa3#

这是一种得到你想要的东西的方法。
使用implicit operators
例如,这需要创建自己的json对象类,然后添加以下内容:

class JsonObject {
    public object obj;

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

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

相关问题