2009-04-21 84 views
2

是否可以限制属性在特定类中应用的数量?C#属性限制

+1

号为什么你想这样做? – 2011-05-23 03:19:32

回答

3

在编译时没有。

在运行时你可以通过一个静态初始化器来验证它,如果这个不变量被违反,这个静态初始化器将会抛出,尽管这会被认为是非常糟糕的风格,它将是安全的,因为在不变量不成立时不能执行代码。

如果你对扩展固有的.Net,即使你可以在编译时验证这一点想象:

编译DLL中的一个与

public class Foo 
{ 
    public int Property1 {get;} 
} 

编译DLL乙引用A.DLL与

public class Bar 
{ 
    [OnlyOneAllowedOnAnyPropertiesPerClass] 
    public int Property2 {get;} 
} 

然后重新编译A.DLL与

public class Foo 
{ 
    [OnlyOneAllowedOnAnyPropertiesPerClass] 
    public int Property1 {get;} 
} 

并尝试运行与老B.DLL这个新A.DLL(它们是二进制兼容的在所有其他方面,所以这是很好)

显然,运行时会做很大的努力健全检查这,不提及B可能会突然加载一段时间使A和B之一或两者“非法”。

因此,您不应该期望这个功能在框架中可用。

1

我不认为这是可能的在编译时。但是你可以添加一些代码给实例构造函数或者一个静态构造函数,它在运行时通过反射来检查它。

1

如果它是重要的(或右后)编译的时候,你应该创建一个FxCop规则或为您的属性(模式像[OnlyOnceAttribute])自定义搜索。

findstr "[OnlyOnceAttribute]" *.cs 

FINDSTR实用程序将返回匹配的线。您只需要一个批处理文件来捕获行数并且get back错误给调用者(= MSBuild任务),并且构建失败。

+0

不错的想法,但请注意,部分类和继承都会颠覆这一点,并且文件中的多个类会导致误报。 只要您有权访问编译后的总代码库,就可以使用正确的FxCop规则。 – ShuggyCoUk 2009-04-21 23:09:22