通过自定义属性生成其他代码

时间:2011-05-20 00:12:18

标签: c# .net attributes custom-attributes

我仍然是C#的新手,我对属性有疑问。是否可以编写自定义属性,在编译时生成其他代码。例如:

[Forever]
public void MyMethod()
{
    // Code
}

变成:

public void MyMethod()
{
    while (true)
    {
        // Code
    }
}

2 个答案:

答案 0 :(得分:7)

开箱即用,不,这不是可以完成的事情。但是,使用PostSharp可以实现:

http://www.sharpcrafters.com/aop.net/compiletime-weaving

答案 1 :(得分:3)

通过对程序集执行编译时修改,

Afterthought与PostSharp的工作方式类似。在Afterthought的情况下,您可以选择如何识别要进行的更改,方法是查找已定义的属性,查找常见模式或仅建立约定。

例如,我正在研究一个使用Afterthought的示例,以便在编译时自动为编译程序集中的DbContext公开的类型实现Entity Framework接口。在这种情况下,我只是寻找任何类型的DbContext的子类,然后查看此类型的属性,以确定要修改哪些POCO类型以使用Entity Framework。

然而,像这样的程序集的编译时操作虽然功能强大,但对我来说仍然是最后的选择。 .NET框架和Microsoft工具本身不支持它。虽然我写了Afterthought来支持需要这种间接性的复杂情况,但我更喜欢尽可能使用标准的面向对象模式和内部C#语言功能,如委托。最后,引入注入代码的自定义属性会在您的解决方案中引入特定于域的语言,这对于审核您的代码的人来说是学习/理解的一个或事物,例如在回答SO问题时; - )