【问题标题】:Generating additional code through a custom attribute通过自定义属性生成附加代码
【发布时间】:2011-08-29 07:15:20
【问题描述】:

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

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

变成:

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

【问题讨论】:

  • 您当然不想生成无限循环。你的愿景是什么?您希望通过属性使用代码生成来实现什么大想法?
  • 这只是一个例子,我想知道它是否可能。但总的来说,无限循环是有用途的。例如,您有一个线程一遍又一遍地做某事。您放入 Thread.Sleep 和一个无限循环并完成。
  • 只是一个例子?你为什么不直接写循环呢?你的计划是什么?如果您没有计划,我们将无法帮助您。
  • A) 在我看来,它使代码更具可读性,因为您不需要再添加一层缩进。 B) 为什么我的计划很重要,我只是想知道这是否可能。一个简单的是或否就足够了。
  • 我想帮助你。不要惊慌失措。即使这不可能,如果你尝试做其他事情,那个也可能是可能的。这就是为什么它很重要。如果你不想要帮助,我会停止尝试。

标签: c# .net attributes custom-attributes


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    相关资源
    最近更新 更多