自定义属性,可以生成编译时错误

时间:2013-11-07 18:04:23

标签: c# attributes compiler-errors

我有一个界面:

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但是想知道这是如何工作的,或者更多的是,我如何实现我自己的具有相同的编译时错误功能。

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

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

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

不确定什么是有用的用例,这种方式会破坏OOP概念。