自定义属性,可以生成编译时错误[复制](Custom Attribute that can gene

2019-10-18 22:59发布

这个问题已经在这里有一个答案:

  • 属性生成的方法调用编译错误? 1个回答

我有一个接口:

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 ,但不知道这是如何工作的,甚至,更是这样,我怎么能实现自己具有相同的编译时错误的功能。

Answer 1:

ObsoleteAttribute是在编译器中的硬编码,你将不能够有相同的行为。 同时也请注意,如果它产生一个编译时警告或错误IsError属性的属性设置为true

你也许可以做的是一个自定义的代码分析(的FxCop)规则,这将做构建反射/反省工作。 但是,这并不那么容易,因为一个属性来使用。

见http://www.binarycoder.net/fxcop/html/index.html的FxCop的SDK

不知道这将是一个有益的使用情况下,无论如何,这种失败的OOP概念。



Answer 2:

一个解决办法是安装此NuGet包: http://www.nuget.org/packages/PostCompile/0.1.0-alpha

一旦安装就会被另一个编译后的任务延长了项目目标,并加少许装配到项目中。 后添加的编译任务将加载您编译的程序集,扫描类型从派生PostCompileTask和执行run方法。

在你的项目中添加从一个新的类派生PostCompileTask类。 然后,您会覆盖获取传递您编译的程序集的Run()方法,并用于记录辅助对象。 在你可以(使用反射)这个run方法扫描组件,用于自定义属性。 当你找到它,你可以调用Error()记录的辅助方法。 这将导致在Visual Studio错误窗口内的错误,并且构建过程的休息站。



文章来源: Custom Attribute that can generate compile time error [duplicate]