2

我有一个界面:

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

4

2 回答 2

3

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

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

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

于 2013-11-07T18:38:12.347 回答
1

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

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

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

无论如何都不确定什么是有用的用例,这违背了 OOP 概念。

于 2013-11-07T18:20:33.187 回答