是否可以限制属性在特定类中应用的数量?C#属性限制
Q
C#属性限制
2
A
回答
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
相关问题
- 1. xsd限制和属性
- 2. Java注释属性限制
- 3. 限制@RequestBody的JSON属性
- 4. 限制属性类型
- 5. C#属性的强制性属性
- 6. vb.net C#属性overiding机制
- 7. 限制对继承属性的访问C#
- 8. C#通用属性限制的解决方法
- 9. 限制属性值取决于另一个属性
- 10. 将属性限制为类或属性可行吗?
- 11. 允许/限制基于其他属性的XML属性
- 12. 限制属性值子属性(参考现有值)
- 13. 限制自定义属性的属性类型
- 14. 存储在HTTPSession中的属性限制
- 15. 限制属性的字符串长度
- 16. 带有限制的指令的属性
- 17. 对索引属性的限制
- 18. NET中属性的限制值
- 19. 限制XML属性的枚举值
- 20. XSD - 验证时忽略属性限制
- 21. 限制某些属性的更新Yii2
- 22. 限制-Wsuggest属性对某些文件
- 23. 将属性限制为特定值
- 24. 限制资源属性是否为RESTful?
- 25. 作为属性包含限制
- 26. XSD:相同的属性值限制
- 27. 限制写入到AD属性
- 28. MATLAB:发现受限制的类属性
- 29. 将值限制为ant属性任务
- 30. 限制栏中属性的更改率
号为什么你想这样做? – 2011-05-23 03:19:32