我正在寻找一种在编译时扩展/注入代码的方法,比如模板/宏/片段。
假设我在应用程序的很多地方都写了这段代码:
[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,但我想扩展它,就像它在同一个类中编写的那样,可以访问所有类内部。
它完全像代码片段,但在编译阶段被扩展。
3条答案
按热度按时间iq0todco1#
一个不需要任何额外费用并且在Visual Studio中支持的解决方案是T4 aka Text Templates。但是,它需要您安装您使用的VS版本的VS SDK(例如,2015)和建模SDK(例如,2015)。
对于我的base class libraries,我最终使用dedicating an assembly作为我在生产代码中编写的T4代码中使用的实用程序。我在IO代码中为原语(例如,.TT和.CS)推出读/写等地方使用它。如果你不需要太多/复杂的编译时代码生成,你不必这样做。
46scxncf2#
我能够通过编写BeforeBuild msbuild目标来调用外部控制台应用程序来实现我的要求,我已经开发了该应用程序:
1.将将要重写的源文件复制到临时文件夹中
1.重写临时文件中的源代码
1.在.csproj文件中添加了条件编译标记,以包含经过处理的源文件,而不是原始文件
它的工作就像一个魅力:)
我正在为这个任务开发一个通用引擎,一旦完成,我会把它提交到github。
vwhgwdsa3#
这是一种得到你想要的东西的方法。
使用implicit operators
例如,这需要创建自己的json对象类,然后添加以下内容:
字符串
但这并不能真正做到你真正想要的。几乎和创建一个新类和添加函数一样。