【问题标题】:Custom Attribute that can generate compile time error [duplicate]可以生成编译时错误的自定义属性[重复]
【发布时间】:2013-11-07 18:04:23
【问题描述】:

我有一个界面:

public interface IBaseInterface
{
    void Base();
}

我使用它像:

public class BaseClass : IBaseInterface
{
    public void Base()
    {

    }
}

但是,我想实现这样的属性:

public class BaseClass : IBaseInterface // Generates Compile-Time Error
{
    public void Base()
    {

    }
}

我只希望能够使用这样的界面:

public interface IAdditionalBaseInterface : IBaseInterface
{

}

public class AdditionalBaseClass : IAdditionalBaseInterface // No Compile-Time Error
{
    public void Base()
    {

    }
}

是否可以有一个自定义的Attribute 来执行此操作?我知道ObsoleteAttribute,但想知道它是如何工作的,或者更重要的是,我如何实现我自己的,它具有相同的编译时错误功能。

【问题讨论】:

  • 请注意,ObsoleteAttribute 作弊并使用编译器魔法来实现它的功能。你不能自己做。
  • @TrevorElliott 我不是不相信你,我不相信没有具体证据或文件来支持他们的陈述的任何人。您可以提供的任何其他链接都会有所帮助。
  • 我已经通过搜索与您类似的问题找到了该信息。你也可以。
  • @gleng:你不能在 Base 类中实现方法 Base。你想达到什么目的?不清楚。
  • 我认为您不能创建这样的属性。您可以做的是创建一个在编译后运行并通过反射检查程序集的构建任务。

标签: c# attributes compiler-errors


【解决方案1】:

一种解决方案是安装此 NuGet 包: http://www.nuget.org/packages/PostCompile/0.1.0-alpha

安装后,它将通过另一个后编译任务扩展项目目标,并为您的项目添加一个小程序集。添加的编译后任务将加载您编译的程序集,扫描源自PostCompileTask 的类型并执行 run 方法。

在您的项目中添加一个派生自PostCompileTask 类的新类。然后,您覆盖传递编译程序集的 Run() 方法,以及用于记录的帮助器对象。在此运行方法中,您可以(使用反射)扫描您的程序集以查找自定义属性。找到后,可以调用日志助手的Error() 方法。这将导致 Visual Studio 错误窗口中出现错误,并且构建过程的其余部分将停止。

【讨论】:

    【解决方案2】:

    ObsoleteAttribute 在编译器中是硬编码的,您将无法拥有相同的行为。另请注意,如果属性的IsError 属性设置为true,则会生成编译时警告或错误。

    您可能可以做的是自定义代码分析 (FxCop) 规则,它将在构建时执行反射/内省工作。但它不会像属性那样容易使用。

    有关 FxCop SDK 的信息,请参阅 http://www.binarycoder.net/fxcop/html/index.html

    不确定什么是有用的用例,这违背了 OOP 概念。

    【讨论】:

    • +1 详细解答。
    • @gleng 你完全正确,我编辑了答案。谢谢。
    • 我会将您的答案标记为已接受。感谢您的帮助!
    • Linq to SQL / 对象。如果您(例如)使用 EF6,并创建 char yes/no 属性的布尔版本以使在其他地方的编码更容易,则不能在调用数据库的 .Where 中使用它,但可以在 .Where 中使用它。在 .ToList() 之后的位置。那时编译器错误会很有帮助。
    猜你喜欢
    • 2013-05-26
    • 1970-01-01
    • 2012-05-22
    • 2017-06-02
    • 2010-11-28
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    相关资源
    最近更新 更多