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

本文关键字:其他 代码 自定义属性 | 更新日期: 2023-09-27 17:56:55

我对C#还很陌生,我有一个关于属性的问题。是否可以编写在编译时生成其他代码的自定义属性。例如:

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

变成:

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

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

开箱即用,不,这不是可以做到的。但是,使用PostSharp可以实现:

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

Afterthought的工作方式类似于PostSharp,通过对程序集执行编译时修改。 在 Afterthought 的情况下,您可以选择如何识别要进行的更改,方法是查找已定义的属性、查找常见模式或简单地建立约定。

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

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