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