【发布时间】:2011-08-21 16:25:44
【问题描述】:
我想确保在编译时永远不会在同一个类上找到两个接口,类似于 AttributeUsage 在编译时检查自定义属性的方式。
例如:
[InterfaceUsage(MutuallyExclusive = typeof(B))]
interface A {
//...
}
interface B {
//...
}
class C : A, B { //should throw an error on compile time
//...
}
我显然可以在运行时通过反射来做到这一点,但我对编译时解决方案感兴趣。
我想可能不存在开箱即用的属性 - 但有没有一种方法可以创建在编译时运行的自定义属性,就像 AttributeUsage 一样?
【问题讨论】:
-
不只是普通的 C# 编译器...
-
你可以建立一个 FxCop 规则。
-
可以用抽象类代替接口吗?
-
我会考虑重新考虑您的对象模型,即使用组合而不是继承。如果某个东西不能同时是 ICat 和 IDog,那么它们不应该是接口。
-
您可能会从编译时解决方案中获得递减收益。 .Net 框架不会试图阻止用户做出不合逻辑的接口实现选择,您也不应该这样做!如果绝对有必要,一些运行时检查是可以的,但实际上,如果用户想要不遗余力地实现一些愚蠢的东西(例如假设的
IQueue、IStack和IDictionary一直来自LinkedList)你应该让他们。
标签: c# attributes custom-attributes compile-time