我有一个接口——虽然它也可以是一个抽象类——它应该允许它的实现者指定他们是否支持特定的特性,我正在寻找实现这一点的最佳方法。
这里有几种选择:
查看 BCL,我看到该类具有和 之类Stream
的属性,可用于检查是否支持某个功能,如果我执行不支持的操作,则抛出一个 。CanRead
CanSeek
NotSupportedException
public interface IHandler
{
bool SupportsA { get; }
bool SupportsB { get; }
void A();
void B();
}
这对我来说是一种合适的方法,尽管我有很多可能受支持或不支持的功能,而且我不想为每个功能定义一个“SupportsX”属性。
我也非常喜欢按位Enum
值,我认为另一种方式是:
[Flags]
public enum HandlerFeature
{
None = 0
A = 1,
B = 2,
C = 4
}
public interface IHandler
{
HandlerFeature Features { get; }
void A();
void B();
void C();
}
并且可以编写这样的扩展方法:
bool Supports<T>(this T handler, HandlerFeature feature) where T : IHandler
我认为这也比其他方法更漂亮,但我不禁认为,如果每个Enum
值都对应合同中的一个成员,我应该能够更明确地标记这些成员。然后我想到了属性:
public interface IHandler
{
[HandlerRequires(Feature.None)]
HandlerFeature Features { get; }
[HandlerRequires(Feature.A)]
void A();
[HandlerRequires(Feature.B)]
void B();
[HandlerRequires(Feature.A | Feature.B)]
void AB();
[HandlerRequires(Feature.C)]
void C();
}
虽然我不知道如何在运行时利用这样的属性,但它确实使接口定义看起来足够明确。
这有最佳实践吗?
还是您推荐的其他方法?
还是我指定的有什么问题?